我想创建一个结构列表,这些结构可以由函数以go-github包中的方式返回。
但是创建和填充此类列表的正确方法是什么?
我发现了两种方法,例如,使用append()
:
...
allowedRepos := strings.Fields("repo1, repo2")
actualRepos := []Repos{}
actualRepos = append(actualRepos, Repos{Name: "repo1", URL: "gth.com/repo1"})
actualRepos = append(actualRepos, Repos{Name: "repo2", URL: "gth.com/repo2"})
...
并通过“直接初始化:
...
actualRepos := []Repos{
Repos{Name: "repo1", URL: "gth.com/repo1"},
Repos{Name: "repo2", URL: "gth.com/repo2"},
}
它们可以工作,但是看起来都有些尴尬和错误。
那么-最好的方法是什么?
似乎需要使用指针创建它,但无法使其正常工作。
答案 0 :(得分:1)
但是看起来都很尴尬和错误
实际上没有什么错,两种方法都是正确和有效的。
唯一的区别-是切片填充时间。
在第二种方法中,您在开发期间填充了切片,这意味着该代码:
actualRepos := []Repos{
Repos{Name: "repo1", URL: "gth.com/repo1"},
Repos{Name: "repo2", URL: "gth.com/repo2"},
}
始终将创建其中包含2个元素的切片。
第一种方法是,您可以在运行时使用append()
来填充切片,例如:
actualRepos := []Repos{}
for _, repo := range allRepos {
actualRepos = append(actualRepos, repo)
}
因此现在所有内容都取决于allRepos
,并且此代码具有在运行时确定的动态行为。
似乎需要使用指针创建
请注意,切片本身通过引用传递,例如:
s := [...]string{"r", "o", "a", "d"}
s2 := s[:]
s[3] = "x"
结果将是:
// s = [r o a x], s2 = [r o a x]