gpt4 book ai didi

struct - 使用 slice 数据初始化结构

转载 作者:IT王子 更新时间:2023-10-29 01:48:08 35 4
gpt4 key购买 nike

Golang 具有三点运算符 (...),当与函数调用一起使用时,它会将 slice 的每个元素转储为它自己的参数,但似乎类似的机制不能与结构初始化器一起使用。

有没有一种方法可以通过在初始化结构时不访问 slice 中的每个元素来减少代码困惑?

是否可以将一个值逐个附加到已初始化的结构或在 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],
}

最佳答案

真正可以做到这一点的唯一方法是使用 unsafe 和 copy 正如您提到的那样,但即使那样您也可能会遇到对齐问题。另一种“紧凑”方式是在字段上使用 reflect 和 for 循环,但这会很慢而且不是很惯用。

唯一可能的方法是引入您自己的语法并编写一个生成器脚本以供 go generate 调用,这将自动转换 Struct{slice...} 进入 Struct{slice[0], slice[1] ... , slice[n] } 其中 n 是字段的数量,但你必须自己滚动。

关于struct - 使用 slice 数据初始化结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32006411/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com