【问题标题】:Golang: create a slice of strutcsGolang:创建一片结构
【发布时间】:2019-04-19 08:08:55
【问题描述】:

我想创建一个可以由函数以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"},
    }  

它们有效,但看起来都有些尴尬和错误。

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

看起来需要使用指针创建它,但无法使其工作。

【问题讨论】:

  • 这两种方法都是正确的,它们都没有错。尴尬,或最好,是主观的。您可以跳过切片元素的文字初始化中的类型,即[]Repos{{ ... }, { ... }} 很好。最后,您可以将切片初始化为特定长度并使用索引填充它,即。 make([]Repos, 2) 然后actualRepos[0] = Repo{ ... } 等等。

标签: list go struct


【解决方案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,现在这段代码具有在运行时确定的动态行为。

看来需要用指针来创建

请注意slice本身是通过引用传递的,例如:

s := [...]string{"r", "o", "a", "d"}
s2 := s[:]
s[3] = "x"

结果将是:

// s = [r o a x], s2 = [r o a x]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2016-05-23
    • 2016-10-08
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多