我有一个定义如下所示的结构: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 关注
- 98 浏览
添加回答
举报
0/150
提交
取消