Maison >développement back-end >Golang >GO AWS SDK s3.GetObjectInput n'est pas un type

GO AWS SDK s3.GetObjectInput n'est pas un type

PHPz
PHPzavant
2024-02-08 22:33:19967parcourir

GO AWS SDK s3.GetObjectInput 不是类型

L'éditeur php Yuzai a rencontré un problème lors de l'utilisation du SDK AWS du langage GO, c'est-à-dire que s3.GetObjectInput n'est pas une erreur de type. Cette erreur se produit souvent lors de l'utilisation du langage GO pour appeler les services AWS S3. Cela signifie que les paramètres de type GetObjectInput sont transmis de manière incorrecte. Il existe de nombreuses façons de résoudre ce problème, notamment en vérifiant si la définition du type dans le code et la transmission des paramètres sont correctes. Avant de résoudre ce problème, comprenons d'abord quel est le type GetObjectInput et son rôle dans le service AWS S3.

Contenu de la question

J'essaie d'utiliser le SDK go d'AWS pour télécharger un fichier depuis s3, en effectuant des opérations similaires à ce qui est fait dans l'exemple fourni par AWS : https://docs.aws.amazon.com/sdk-for- aller/api /service/s3/

package main

import (
    "context"
    "fmt"
    "io/ioutil"
    "os"
    "path/filepath"

    "github.com/aws/aws-sdk-go/service/s3"
    "github.com/aws/aws-sdk-go/service/s3/s3manager"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/davidbyttow/govips/v2/vips"
)

func handler(ctx context.Context, s3Event events.S3Event) {
    for _, record := range s3Event.Records {
        s3 := record.S3

        sess, err := session.NewSession(&aws.Config{
            Region: aws.String("<REGION>"),
        })
        if err != nil {
            exitErrorf("cannot create s3 session, %v", err)
        }
    
        downloader := s3manager.NewDownloader(sess)

        file, err := os.Create(filepath.Base(s3.Object.Key))

        if err != nil {
            exitErrorf("DownloadFile:::Unable to open file, %v", err)
        }

        defer file.Close()

        numBytes, err := downloader.Download(file,
            &s3.GetObjectInput{
                Bucket: aws.String("<BUCKET>"),
                Key:    aws.String(s3.Object.Key),
            })

        if err != nil {
            exitErrorf("Unable to download item %q, %v", s3.Object.Key, err)
        }

        fmt.Println("Downloaded", file.Name(), numBytes, "bytes")
}

Lorsque j'essaie de construire le projet, j'obtiens l'erreur : “github.com/aws/aws-sdk-go/service/s3”已导入但未使用 et s3.getobjectinput 不是类型

J'ai exécuté Go Get sur les packages utilisés et Go Mod Tidy pour ranger mes fichiers go.mod. Il semble parfaitement satisfait de la gamme s3manager et des autres packages AWS, il se plaint simplement des références s3.

Est-ce que j'ai raté quelque chose de simple ?

Solution

Le package importégithub.com/aws/aws-sdk-go/service/s3的包名为s3,通过s3 := record.s3est masqué. C'est pourquoi vous voyez l'erreur.

La solution suggérée est de modifier s3 := record.s3 以选择其他身份。例如,s3entity := record.s3。不要忘记将源代码中的 s3.object.key 替换为 s3entity.object.key .

Une autre option consiste à donner un autre nom au package importé. Par exemple :

import awss3 "github.com/aws/aws-sdk-go/service/s3"

Référez-vous à la section « Déclarations et champ d'application » du Spécification :

La déclaration lie un identifiant non nul à une constante, un type, un paramètre de type, une variable, une fonction, une étiquette ou un package. ...

go utilise des blocs pour la portée lexicale :

  • La portée des identifiants prédéclarés est le bloc univers.
  • Indique que la portée d'un identifiant pour une constante, un type, une variable ou une fonction (mais pas une méthode) déclarée au niveau supérieur (en dehors de toute fonction) est le bloc de package.
  • La portée du nom de package d'un package importé est le bloc de fichier du fichier contenant la déclaration d'importation.
  • La portée d'un identifiant représentant un récepteur de méthode, un paramètre de fonction ou une variable de résultat est le corps de la fonction.
  • Indique que la plage d'identifiants déclarés pour les paramètres de type de fonction ou les récepteurs de méthode commence après le nom de la fonction et se termine à la fin du corps de la fonction.
  • La plage d'identifiants représentant les paramètres de type d'un type commence après le nom du type et se termine à la fin de la spécification de type.
  • La portée d'un identifiant de constante ou de variable déclaré dans une fonction commence à la fin du constspec ou varspec (shortvardecl pour les déclarations de variables courtes) et se termine à la fin du bloc contenant le plus interne.
  • La portée d'un identifiant de type déclaré à l'intérieur d'une fonction commence à partir de l'identifiant dans la spécification de type et se termine à la fin du bloc conteneur le plus interne.

Les identifiants déclarés dans les blocs peuvent être redéclarés dans les blocs internes. Lorsqu'un identifiant déclaré en interne est dans la portée, il représente l'entité déclarée par la déclaration interne .

Voir également Déclaration d'importation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer