[英]initializing a struct containing a slice of structs in golang
我有一个结构,我想用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)
}
您可以使用make()
以“full-size”分配切片,然后使用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
循环中我们需要做的只是使用索引表达式 tmp[i]
指定的struct值。
您可以像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
仅包含初始化值,而不是未初始化的零值。 根据您的代码,它可能会有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.