+ 收藏我们

网站模板

网站模板搜索
404模板 营销型模板 外贸网站模板 单页模板 双语模板 标签大全
电话:18630701785
首页 > 站长学院 > 在 GO 中将映射编组到结构字段的最佳方法 >

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

时间:2024-04-17 11:09:27

我想知道基于 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。否则,只需使用简单的代码 - 从长远来看,这是最好的方法。

文中关于的知识介绍,希望对你的学习有所帮助!

有问题可以加入网站技术QQ群一起交流学习

本站会员学习、解决问题QQ群(691961965)

客服微信号:lpf010888

Title