go - 使用 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}]
想知道为什么要添加默认值的切片元素。这不是一件错误的事情吗?如果我用更大的容量初始化这个切片,那么我会看到许多具有默认值的此类元素。它在迭代这个切片时增加了额外的成本。
解决方案
你需要做:
make([]abc, 0, 1)
第二个参数是片数,第三个是容量。
如果你用它初始化一个切片,s := make([]abc, 1)
它将包含一个空元素。您可以使用 覆盖该元素s[0] = xyz
。如果您append
进入切片,则空元素将保留并添加新元素。
注意:init
这里不需要该函数。你可以这样做:
// package level declaration
var abcList = make([]abc, 0, 1)
推荐阅读
- javascript - Disqus 最近的评论小部件
- python - 使用 Struct 将字节解包为字符串
- javascript - 从NodeJS服务器发送JS脚本到客户端执行它,客户端看不到JS脚本
- amazon-web-services - VPN over DX 到 S3
- anylogic - 你如何计算一个节点或区域内的行人?
- r - 在 Eclipse 中运行 RInside 示例时出错
- php - 为 Microsoft 帐户请求基本帐户信息的正确端点
- php - htaccess 404 错误仅显示在目录上
- .net - 我无法在其他 .Net 项目中引用静态 C++/clr 库
- join - Yii2. 一列重命名的多个innerJoinWith