在 GO 中将映射编组到结构字段的最佳方法

时间:2021-03-10 14:01:16

标签: go

我想知道哪种方法是基于 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,但我不知道使用反射是否是最好的方法,因为文件很大,并且每一行都将使用反射。

也许没有其他选择,但我只是问以防万一有人知道更好的方法。

提前致谢。

2 个答案:

答案 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

希望有用

相关问题