我有一个结构,我想用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)
}
Run Code Online (Sandbox Code Playgroud)
icz*_*cza 11
您可以使用make()"全尺寸"分配切片,然后使用a for range来迭代它并填充数字:
tmp := make([]LuckyNumber, 10)
for i := range tmp {
tmp[i].number = rand.Intn(100)
}
a := Person{tmp}
fmt.Println(a)
Run Code Online (Sandbox Code Playgroud)
在Go Playground尝试一下.
请注意,在for我内部没有创建结构的新"实例" LuckyNumber,因为切片已经包含它们; 因为切片不是指针的一部分.所以for我们需要做的就是使用索引表达式 指定的struct值tmp[i].
你可以使用make()icza建议的方式,也可以这样使用:
tmp := make([]LuckyNumber, 0, countOfLuckyNums)
for i := 0; i < countOfLuckyNums; i++ {
tmp = append(tmp, LuckyNumber{rand.Intn(100)})
}
a := Person{tmp}
fmt.Println(a)
Run Code Online (Sandbox Code Playgroud)
这样,您就不必tmp多次分配内存:只需在调用 make 时执行一次即可。但是,与您调用的版本相反make([]LuckyNumber, countOfLuckyNums),这里tmp仅包含初始化值,而不包含未初始化的归零值。根据您的代码,它可能会产生影响,也可能不会产生影响。
| 归档时间: |
|
| 查看次数: |
19263 次 |
| 最近记录: |