【问题标题】:How to call the Values function in aws-sdk-go-v2?如何在 aws-sdk-go-v2 中调用 Values 函数?
【发布时间】:2021-12-10 00:49:01
【问题描述】:

我正在编写一个程序,它使用 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() 函数不使用发送给它的类型。

【问题讨论】:

    标签: aws-sdk-go


    【解决方案1】:

    我完全同意你的观点,这是一个奇怪的 api 设计。 (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() 方法时使用的值没有意义。

    【讨论】:

      猜你喜欢
      • 2022-11-30
      • 2021-04-23
      • 2020-08-17
      • 1970-01-01
      • 2022-11-23
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多