更好的初始化

Better initialization

我正在 API 调用 AWS 以使用 Golang SDK 获取 AMI 列表。 DescribeImages function takes in DescribeImagesInput。我只想查看我自己的 AMI,所以我的代码是这样做的:

// Build input
self := "self"
ownerSelf := []*string{&self}
ownImages := &ec2.DescribeImagesInput{
    Owners: ownerSelf,
}

// Call the DescribeImages Operation
resp, err := svc.DescribeImages(ownImages)
if err != nil {
    panic(err)
}

像这样构建输入非常丑陋。我确信有更好的技术,但作为一个 Golang n00b,我不知道。什么是更好的方法?

我不知道这有多容易接受,但它应该这样做:

self := "self"
resp, err := svc.DescribeImages(
    &ec2.DescribeImagesInput{
        Owners: []*string{&self},
    },
}
if err != nil {
    panic(err)
}

当然可以缩短,尽管以可读性 IMO 为代价

self := "self"
resp, err := svc.DescribeImages(&ec2.DescribeImagesInput{Owners:[]*string{&self}}}
if err != nil {
    panic(err)
}

没有比这更短的了:

self := "self"
ownImages := &ec2.DescribeImagesInput{Owners: []*string{&self}}

或者在一行中(没有 self 字符串变量):

ownImages := &ec2.DescribeImagesInput{Owners: []*string{&[]string{"self"}[0]}}

(这里发生的是我用一个元素 "self" 创建了一个 []string 切片,索引它唯一的元素并获取它的地址并使用这个值来初始化所需的 []*string。 )

你可以做的是创建一个辅助函数,它为你构建 string 指针的切片:

func sp(es ...string) []*string {
    s := make([]*string, len(es))
    for i := range es {
        s[i] = &es[i]
    }
    return s
}

有了这个,声明变成:

ownImages = &ec2.DescribeImagesInput{Owners: sp("self")}

Go Playground 上试用。