使用 make 函数创建结构切片时默认添加空元素

我有一个定义如下所示的结构:


type abc struct {

  srcName string

  destName string

  flag    bool  'default:false'

}

在我的代码中,我使用 make 函数对其进行初始化


var abcList []abc


func 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}]

想知道为什么要添加默认值的切片元素。这不是一件错误的事情吗?如果我用更大的容量初始化这个切片,那么我会看到许多具有默认值的此类元素。它在迭代这个切片时增加了额外的成本。


沧海一幻觉
浏览 129回答 4
4回答

叮当猫咪

你需要做:make([]abc, 0, 1)第二个参数是片数,第三个是容量。如果你用它初始化一个切片,s := make([]abc, 1)它将包含一个空元素。您可以使用 覆盖该元素s[0] = xyz。如果您append进入切片,则空元素将保留并添加新元素。注意:init这里不需要该函数。你可以这样做:// package level declarationvar abcList = make([]abc, 0, 1)

拉莫斯之舞

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

MYYA

的go &nbsp;make([]abc, 1) 长度设置为1。为了理解它,数组初始化的 go 语法是make([]array,&nbsp;length,&nbsp;capacity)在哪里创建和初始化一个新array的大小length,可以扩展到capacity.&nbsp;在您的情况下length=1,意味着创建一个类型数组[]abc并使用默认值初始化一个元素。capacity不存在,这意味着capacity=n您可以通过以下方式避免默认值初始化,make([]abc,&nbsp;0,&nbsp;<1...n>)或者abcList&nbsp;=&nbsp;[]abc{}

Helenr

我看不到在哪里调用了初始化代码。发布此问题时,您一定错过了上面的代码。你没有init()在任何地方调用main()init 函数是不必要的,因为您在 main() 函数中使用了 append。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go