我有一個定義如下所示的結構:type abc struct { srcName string destName string flag bool 'default:false'}在我的代碼中,我使用 make 函數對其進行初始化var abcList []abcfunc init() { abcList = make([]abc, 1)}func main() { var abcElem abc abc.srcName = "src" abc.destName = "dest" abc.flag = true abcList = append(abcList, abc) klog.Info("abcList:", abcList)}我看到輸出為:abcList: [{ false} {"src", "dest", true}]想知道為什么要添加默認值的切片元素。這不是一件錯誤的事情嗎?如果我用更大的容量初始化這個切片,那么我會看到許多具有默認值的此類元素。它在迭代這個切片時增加了額外的成本。
4 回答

叮當貓咪
TA貢獻1776條經驗 獲得超12個贊
你需要做:
make([]abc, 0, 1)
第二個參數是片數,第三個是容量。
如果你用它初始化一個切片,s := make([]abc, 1)它將包含一個空元素。您可以使用 覆蓋該元素s[0] = xyz。如果您append進入切片,則空元素將保留并添加新元素。
注意:init這里不需要該函數。你可以這樣做:
// package level declaration
var abcList = make([]abc, 0, 1)

MYYA
TA貢獻1868條經驗 獲得超4個贊
的go make([]abc, 1)
長度設置為1
。為了理解它,數組初始化的 go 語法是
make([]array, length, capacity)
在哪里創建和初始化一個新array
的大小length
,可以擴展到capacity
. 在您的情況下length=1
,意味著創建一個類型數組[]abc
并使用默認值初始化一個元素。capacity
不存在,這意味著capacity=n
您可以通過以下方式避免默認值初始化,
make([]abc, 0, <1...n>)
或者
abcList = []abc{}

Helenr
TA貢獻1780條經驗 獲得超4個贊
我看不到在哪里調用了初始化代碼。發布此問題時,您一定錯過了上面的代碼。你沒有init()
在任何地方調用main()
init 函數是不必要的,因為您在 main() 函數中使用了 append。
- 4 回答
- 0 關注
- 120 瀏覽
添加回答
舉報
0/150
提交
取消