php小编鱼仔在使用GO语言的AWS SDK时,遇到了一个问题,即s3.GetObjectInput不是类型的错误。这个错误在使用GO语言调用AWS S3服务时经常遇到,它意味着GetObjectInput类型的参数传递错误。解决这个问题的方法有很多,包括检查代码中的类型定义、参数传递是否正确等。在解决这个问题之前,我们先了解一下GetObjectInput是什么类型,以及它在AWS S3服务中的作用。
问题内容
我尝试使用 aws 的 go sdk 从 s3 下载文件,执行类似于 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(""),
})
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(""),
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")
}
登录后复制
当我尝试构建项目时,出现错误:
“github.com/aws/aws-sdk-go/service/s3”已导入但未使用
和
s3.getobjectinput 不是类型
我已经运行了 go get on 使用的软件包和 go mod tidy 来整理我的 go.mod 文件。它似乎对 s3manager 行和其他 aws 软件包非常满意,它只是抱怨 s3 引用。
我缺少一些简单的东西吗?
解决方法
导入的包github.com/aws/aws-sdk-go/service/s3
的包名为s3
,通过s3 := record.s3
隐藏。这就是您看到错误的原因。
建议的解决方案是修改 s3 := record.s3
以选择其他身份。例如,s3entity := record.s3
。不要忘记将源代码中的 s3.object.key
替换为 s3entity.object.key
。
另一个选项是为导入的包指定另一个名称。例如:
import awss3 "github.com/aws/aws-sdk-go/service/s3"
登录后复制
参考规范的“声明和范围”部分:
声明将非空标识符绑定到常量、类型、类型参数、变量、函数、标签或包。 ...
go 使用块进行词法作用域:
- 预声明标识符的范围是 universe 块。
- 表示在顶层(任何函数外部)声明的常量、类型、变量或函数(但不是方法)的标识符的范围是包块。
- 导入包的包名范围是包含导入声明的文件的文件块。
- 表示方法接收者、函数参数或结果变量的标识符的范围是函数体。
- 表示函数类型参数或方法接收者声明的标识符的范围从函数名称之后开始,到函数体末尾结束。
- 表示类型的类型参数的标识符的范围从类型名称之后开始,到 typespec 末尾结束。
- 函数内声明的常量或变量标识符的范围从 constspec 或 varspec(用于短变量声明的 shortvardecl)末尾开始,到最内层包含块的末尾结束。
- 函数内部声明的类型标识符的范围从 typespec 中的标识符开始,到最内层包含块的末尾结束。
在块中声明的标识符可以在内部块中重新声明。当内部声明的标识符在范围内时,它表示内部声明所声明的实体。
另请参阅导入声明。
以上就是GO AWS SDK s3.GetObjectInput 不是类型的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!