簡體   English   中英

在golang中初始化包含一片結構的結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM