用切片数据初始化结构体



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],
}

真正可以做到这一点的唯一方法是使用不安全的和copy,但即使这样,您也容易遇到对齐问题。另一种"紧凑"的方法是在字段上使用reflect和for循环,但这样会很慢,而且不太习惯。

唯一的其他可能的方法是也许引入您自己的语法并编写由go generate调用的生成器脚本,它将自动将Struct{slice...}转换为Struct{slice[0], slice[1] ... , slice[n] },其中n是字段的数量,但您必须自己滚动

除了Jsor的建议之外,您还可以创建一个NewStats方法,该方法采用椭圆参数并使用它来代替第一个示例。

这也不是习惯用法,但是你可以减少代码中的混乱,并且只需要编写一次难看的部分…

最新更新