为了账号安全,请及时绑定邮箱和手机立即绑定

使用 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 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信