2015-03-31 76 views
1

我正在向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,我不知道。什么是更好的方法?

回答

2
缩短,虽然

你不能拿任何比这更短:

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

或者在同一行(不self串VA可变结构):

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

(这里会发生什么事是我创建了一个[]string片一个元素"self",指数的唯一因素,并采取它的地址,并使用这个值来初始化所需[]*string

什么你可以做的就是创建一个辅助功能,构建了string指针切片为您提供:

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

这样,delcaration变为:

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

Go Playground上试试。

0

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

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) 
}