亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 make 函數創建結構切片時默認添加空元素

使用 make 函數創建結構切片時默認添加空元素

Go
滄海一幻覺 2022-07-11 16:04:45
我有一個定義如下所示的結構: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)


查看完整回答
反對 回復 2022-07-11
?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

make([]abc, 0, 1) 或僅使用 var abcList []abc 不要使用 make 初始化



查看完整回答
反對 回復 2022-07-11
?
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{}


查看完整回答
反對 回復 2022-07-11
?
Helenr

TA貢獻1780條經驗 獲得超4個贊

我看不到在哪里調用了初始化代碼。發布此問題時,您一定錯過了上面的代碼。你沒有init()在任何地方調用main()

init 函數是不必要的,因為您在 main() 函數中使用了 append。


查看完整回答
反對 回復 2022-07-11
  • 4 回答
  • 0 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號