我想知道哪种方法是基于 map[string]string
创建特定结构体实例的最佳方式
我的应用应该处理 CSV 格式的大文件,并且应该为文件的每一行创建一个结构体实例。
我已经在使用 golang 中的 encoding/csv/Reader
来读取 CSV 文件并为文件中的每一行创建一个 map[string]string
实例。
所以给定这个文件:
columnA, columnB, columnC
a, b, c
我自己的阅读器实现将返回这个地图(每行值都带有标题):
myMap := map[string]string{
"columnA": "a",
"columnB": "b",
"columnC": "c",
}
(这只是现实生活中的一个例子,文件包含很多列和行)
所以..此时我需要创建一个与行内容相关的结构实例,比如:
type MyStruct struct {
AColumn string
BColumn string
CColumn string
}
我的问题是使用给定映射创建结构实例的最佳方法是什么,我已经实现了一个版本,该版本仅将映射中的每个值复制到结构中,但代码最终很长并且乏味:
s := &MyStruct{}
s.AColumn := m["columnA"]
s.AColumn := m["columnB"]
s.AColumn := m["columnC"]
...
我也考虑使用这个库 https://github.com/mitchellh/mapstructure,但我不知道使用反射是否是最好的方法,因为文件很大,并且每一行都将使用反射。
也许没有其他选择,但我只是问以防万一有人知道更好的方法。
提前致谢。
答案 0 :(得分:2)
我会说惯用的 Go 方式只是从地图中填充结构体的字段。 Go 支持明确性,这种方法更直接,也最容易阅读。换句话说,您的方法是正确的。
你可以通过直接初始化结构来让它更好一点:
s := &MyStruct{
AColumn: m["columnA"],
BColumn: m["columnB"],
CColumn: m["columnC"],
}
现在,如果您的结构有数百个字段(这是一个奇怪的设计选择),您可能想要leverage some code generation。否则,只需使用简单的代码 - 从长远来看,这是最好的方法。
答案 1 :(得分:0)
我已经发布了一个我为有时需要的东西制作的库,几个月前我制作了一个 MapToStruct,我今天推送它与您分享完整的库。该库基于reflect的用法,我还在测试和实现东西,你会发现一些奇怪的评论之类的东西。
https://github.com/FedeMFernandez/goscript
希望有用