在golang中初始化包含一片结构的结构

时间:2017-03-03 14:15:35

标签: go struct slice

我有一个结构,我想用golang中的一些结构进行初始化,但是我想弄清楚是否有更高效的版本将每个新生成的结构附加到切片:

package main

import (
    "fmt"
    "math/rand"
)

type LuckyNumber struct {
    number int
}

type Person struct {
    lucky_numbers []LuckyNumber
}

func main() {
    count_of_lucky_nums := 10
    // START OF SECTION I WANT TO OPTIMIZE
    var tmp []LuckyNumber
    for i := 0; i < count_of_lucky_nums; i++ {
        tmp = append(tmp, LuckyNumber{rand.Intn(100)})
    }
    a := Person{tmp}
    // END OF SECTION I WANT TO OPTIMIZE
    fmt.Println(a)
}

2 个答案:

答案 0 :(得分:9)

您可以使用make()以“完整尺寸”分配切片,然后使用for range对其进行迭代并填充数字:

tmp := make([]LuckyNumber, 10)
for i := range tmp {
    tmp[i].number = rand.Intn(100)
}
a := Person{tmp}
fmt.Println(a)

Go Playground上尝试。

请注意,在for内部我没有创建LuckyNumber结构的新“实例”,因为切片已经包含它们;因为切片不是指针的一部分。因此,在for循环中我们只需要使用index expression tmp[i]指定的struct值。

答案 1 :(得分:3)

你可以像icza建议的那样使用make(),你也可以这样使用它:

tmp := make([]LuckyNumber, 0, countOfLuckyNums)
for i := 0; i < countOfLuckyNums; i++ {
    tmp = append(tmp, LuckyNumber{rand.Intn(100)})
}
a := Person{tmp}
fmt.Println(a)

这样,您不必多次为tmp分配内存:在调用make时只需执行一次。但是,与您调用make([]LuckyNumber, countOfLuckyNums)的版本相反,此处tmp仅包含初始化值,而不包含未初始化的零值。根据您的代码,它可能会有所不同。