我想知道基于 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/mapstruct,但我不知道使用反射是否是最好的方法,因为文件很大并且将为每一行使用反射。
也许没有其他选择,但我问只是为了以防万一有人知道更好的方法。
提前致谢。
解决方案
我想说,惯用的 go 方式只是从地图中填充结构体的字段。 go 偏向于明确性,这种方法更直接、最容易阅读。换句话说,你的做法是正确的。
您可以通过直接初始化结构来使其稍微好一点:
s := &MyStruct{
AColumn: m["columnA"],
BColumn: m["columnB"],
CColumn: m["columnC"],
}
现在,如果您的结构有 100 个字段(这是一个奇怪的设计选择),您可能需要 leverage some code generation。否则,只需使用简单的代码 - 从长远来看,这是最好的方法。
文中关于的知识介绍,希望对你的学习有所帮助!