Golang:创建一片strutcs

时间:2019-04-19 08:08:56

标签: list go struct

我想创建一个结构列表,这些结构可以由函数以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"},
    }  

它们可以工作,但是看起来都有些尴尬和错误。

那么-最好的方法是什么?

似乎需要使用指针创建它,但无法使其正常工作。

1 个答案:

答案 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]