Home >Backend Development >Golang >GO AWS SDK s3.GetObjectInput is not a type

GO AWS SDK s3.GetObjectInput is not a type

PHPz
PHPzforward
2024-02-08 22:33:19962browse

GO AWS SDK s3.GetObjectInput 不是类型

php Xiaobian Yuzai encountered a problem when using the AWS SDK of GO language, that is, s3.GetObjectInput is not a type error. This error is often encountered when using the GO language to call AWS S3 services. It means that the parameters of the GetObjectInput type are passed incorrectly. There are many ways to solve this problem, including checking whether the type definition in the code and parameter passing are correct. Before solving this problem, let's first understand what type GetObjectInput is and its role in the AWS S3 service.

Question content

I try to use aws's go sdk to download files from s3, performing operations similar to what is done in the example provided by aws: https://docs.aws.amazon.com /sdk-for-go /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")
}

When I try to build the project, I get the error: "github.com/aws/aws-sdk-go/service/s3" is imported but not used and s3.getobjectinput is not a type

I've run go get on the packages used and go mod tidy to tidy up my go.mod files. It seems perfectly happy with the s3manager line and other aws packages, it just complains about s3 references.

Am I missing something simple?

Solution

The package name of the imported package github.com/aws/aws-sdk-go/service/s3 is s3, Hidden by s3 := record.s3. That's why you see the error.

The suggested solution is to modify s3 := record.s3 to select a different identity. For example, s3entity := record.s3. Don't forget to replace s3.object.key with s3entity.object.key in your source code.

Another option is to specify another name for the imported package. For example:

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

Refer to the "Declarations and Scope" section of the specification:

Declaration binds a non-null identifier to a constant, type, type parameter, variable, function, label, or package. ...

go Use blocks for lexical scoping:

  • The scope of predeclared identifiers is the universe block.
  • Indicates that the scope of an identifier for a constant, type, variable, or function (but not a method) declared at the top level (outside any function) is the package block.
  • The package name range of an imported package is the file block of the file containing the import declaration.
  • The scope of identifiers representing method receivers, function parameters, or result variables is the function body.
  • Indicates that the range of identifiers declared by function type parameters or method receivers starts after the function name and ends at the end of the function body.
  • The range of identifiers representing type parameters of a type starts after the type name and ends at the end of the typespec.
  • The scope of a constant or variable identifier declared within a function starts from the end of the constspec or varspec (shortvardecl for short variable declarations) and ends at the end of the innermost containing block.
  • The range of type identifiers declared within a function starts from the identifier in the typespec and ends at the end of the innermost containing block.

Identifiers declared in blocks can be redeclared in inner blocks. When an inner-declared identifier is in scope, it represents the entity declared by the inner declaration.

See also Import declarations.

The above is the detailed content of GO AWS SDK s3.GetObjectInput is not a type. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete