【问题标题】:Better initialization更好的初始化
【发布时间】:2015-06-04 06:54:42
【问题描述】:
我正在对 AWS 进行 API 调用,以获取使用 Golang SDK 的 AMI 列表。 DescribeImages 函数接受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,我不知道。有什么更好的方法?
【问题讨论】:
标签:
amazon-web-services
go
initialization
【解决方案1】:
你不能比这更短:
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 上试用。
【解决方案2】:
我不知道这可以接受多少,但它应该这样做:
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)
}