我正在编写一个程序,它使用aws-sdk-go-v2并接收来自用户的字符串输入,以确定在S3中存储对象时使用哪个存储类。我必须验证输入是否是允许值,如果不是,我会给出一个允许值的列表。
在aws-sdk-go的v1中,您可以调用s3.StorageClass_Values()来枚举允许的StorageClass值。
func StorageClass_Values() []string示例:
// v1.go
package main
import (
"fmt"
"github.com/aws/aws-sdk-go/service/s3"
)
func main() {
fmt.Println(s3.StorageClass_Values())
}$ go run v1.go
[STANDARD REDUCED_REDUNDANCY STANDARD_IA ONEZONE_IA INTELLIGENT_TIERING GLACIER DEEP_ARCHIVE OUTPOSTS]但是在aws-sdk-go-v2中,为StorageClass引入了类型,枚举值的函数需要调用一个类型。
来自the docs
func (StorageClass) Values() []StorageClass这似乎需要一个初始化的变量来调用?为什么会这样呢?调用这个函数的惯用方式是什么?
我已经设法用两种不同的方式让它工作了,两种方式似乎都错了。
// v2.go
package main
import (
"fmt"
s3Types "github.com/aws/aws-sdk-go-v2/service/s3/types"
)
func main() {
// Create uninitialized StorageClass variable and call .Values()
var sc s3Types.StorageClass
fmt.Println(sc.Values())
// One-liner that uses one of the types directly:
fmt.Println(s3Types.StorageClassStandard.Values())
}$ go run v2.go
[STANDARD REDUCED_REDUNDANCY STANDARD_IA ONEZONE_IA INTELLIGENT_TIERING GLACIER DEEP_ARCHIVE OUTPOSTS]
[STANDARD REDUCED_REDUNDANCY STANDARD_IA ONEZONE_IA INTELLIGENT_TIERING GLACIER DEEP_ARCHIVE OUTPOSTS]一行代码更好,因为它更简洁,但我必须引用其中一个存储类,它没有特定的含义,所以感觉是错误的。
我应该使用哪一个?为什么?
我希望他们只是简单地保留了v1的调用约定。v2中的Values()函数不使用发送给它的类型。
发布于 2021-11-05 07:07:39
(StorageClass) Values()未使用接收器。这是sdk代码:
func (StorageClass) Values() []StorageClass {
return []StorageClass{
"STANDARD",
"REDUCED_REDUNDANCY",
"STANDARD_IA",
"ONEZONE_IA",
"INTELLIGENT_TIERING",
"GLACIER",
"DEEP_ARCHIVE",
"OUTPOSTS",
}
}我假设这是因为代码是生成的,并且基于用于为各种语言创建SDK的一些公共表示,
在我看来,一行程序是可行的,因为它避免了引入未使用的变量:
s3Types.StorageClassStandard.Values()然而,引入一个新的变量会突出一个事实,即调用Values()方法时使用的值没有任何意义。
https://stackoverflow.com/questions/69692732
复制相似问题