gpt4 book ai didi

go - 如何从数组创建Golang结构实例?

转载 作者:行者123 更新时间:2023-12-01 22:38:14 25 4
gpt4 key购买 nike

假设我有一堆字符串,例如:

data := [4]string{"a", "3.0", "2.5",  "10.7"}

和一个结构定义:
type Record struct {
name string
x float64
y float64
mag float64
}

我想从每个数组创建此结构的实例。

我需要将数组的第一项与struct的第一字段进行匹配,依此类推。是否有可能做到这一点?
每个数组对应一个文件的一行,因此我可以实际决定在不同方法更好的情况下如何读取这些值。

最佳答案

一种简单的方法是使用反射来遍历该结构的字段,获取其地址(指针),并使用 fmt.Sscan() 将字符串值扫描到该字段中。 fmt.Sscan()将为您处理不同类型的字段。这绝不是一个有效的解决方案,它只是一个简短,简单且灵活的解决方案。如果需要有效的解决方案,则必须手动显式处理所有字段。

仅在导出结构的字段时才有效,例如:

type Record struct {
Name string
X float64
Y float64
Mag float64
Age int
}

将字符串 slice 加载到结构值中的函数:
func assign(recordPtr interface{}, data []string) error {
v := reflect.ValueOf(recordPtr).Elem()
max := v.NumField()
if max > len(data) {
max = len(data)
}

for i := 0; i < max; i++ {
if _, err := fmt.Sscan(data[i], v.Field(i).Addr().Interface()); err != nil {
return err
}
}

return nil
}

请注意,此实现会尝试填充尽可能多的字段(例如,如果结构的字段多于提供的输入数据,则结构不会返回错误)。还要注意,此 assign()函数可以填充其他任何结构,而不仅仅是 Record,这就是它如此灵活的原因。

测试示例:
data := []string{"a", "3.0", "2.5", "10.7", "23"}

var r Record
if err := assign(&r, data); err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%+v", r)

输出(在 Go Playground上尝试):
{Name:a X:3 Y:2.5 Mag:10.7 Age:23}

关于go - 如何从数组创建Golang结构实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59159425/

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