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

mgo*_*ser 9 struct go 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)
}
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].


Fab*_*ien 5

你可以使用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仅包含初始化值,而不包含未初始化的归零值。根据您的代码,它可能会产生影响,也可能不会产生影响。

  • 哦,另一个答案也避免了重复分配(Fabien 在 OP 中指的是您的版本)。然而,另一个答案在 `make()` 调用中将切片的长度设置为等于 `countOfLuckyNums`,而 Fabien 的版本分配该大小的底层数组,但保留切片长度 0。如果您由于某种原因提前中断附加序列。示例:https://play.golang.org/p/bIs1jmEhrp (3认同)