【发布时间】:2015-08-14 09:11:46
【问题描述】:
Golang 有三个点运算符 (...),当与函数调用一起使用时,它将切片的每个元素作为自己的参数转储,但似乎类似的机制不能与结构初始化器一起使用。
有没有办法通过在初始化结构时不访问切片中的每个元素来减少代码混乱?
是否可以将一个值一个接一个地附加到已初始化的结构中,或者在 for 循环中访问某种索引?
(我想可以访问已初始化结构的直接内存位置 - 但我不想这样做)
以下内容不起作用:(语法错误)
type Stats struct {
Total uint64
ICMP uint64
UDP uint64
TCP uint64
FTP uint64
HTTP uint64
MAIL uint64
P2P uint64
}
func newStats(slice [][]byte) *Stats {
var tmp [8]uint64
var err error
for i, val := range slice {
tmp[i], err = strconv.ParseUint(string(val), 10, 32)
if err != nil {
// Handle error
}
}
return &Stats{tmp...} // Syntax error
}
这也不行:(当然)
return &Stats{
for{ <code> }
}
这行得通,但我希望有一种惯用的、更快的方法,没有语法复制
return &Stats{
tmp[0],
tmp[1],
tmp[2],
tmp[3],
tmp[4],
tmp[5],
tmp[6],
tmp[7],
}
【问题讨论】:
-
我认为这可能是一个不好的方法。如果字段的顺序发生变化怎么办?如果添加/删除字段怎么办?我建议始终使用显式形式(即
T{A: s[0], B: s[1], /* ... */})。 -
它可能是,这就是为什么它首先是不可能的。这让我很想知道。
标签: struct go initialization slice