GO AWS SDK s3.GetObjectInput is not a type

PHPz
Release: 2024-02-08 22:33:19
forward
927 people have browsed it

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")
}
Copy after login

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"
Copy after login

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!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!