了解和使用golang有一段时间了,由于项目比较赶,基本是现学现卖的节奏。最近有时间会在简书上记录遇到的一些问题和解决方案,希望可以一起交流探讨。
需求
在golang中,给定一组数据,例如map[string]interface{}类型的数据,创建一个对应的struct并赋值
简易实现
var data = map[string]interface{}{
"id": 1001,
"name": "apple",
"price": 16.25,
}
type Fruit struct {
ID int
Name string
Price float64
}
func newFruit(data map[string]interface{}) *Fruit {
s := Fruit{
ID: data["id"].(int),
Name: data["name"].(string),
Price: data["price"].(float64),
}
return &s
}
func main() {
fruit := newFruit(data)
log.Println("fruit:", fruit)
}
> fruit: &{1001 apple 16.25}
这样实现简单快速,但也有缺点:
难以维护,每次新增字段都要修改newFruit函数
不够优雅,需要手动对每一个字段进行赋值和类型转换
不够通用,只能创建钦定的struct
改进
是否有更好的解决方法,自动遍历struct对象,并进行赋值呢?
首先想到for...range操作符,但golang里range无法对结构体进行遍历。
(如果只需遍历struct而不用赋值,可以尝试邪道组合:json.Marshal()和json.Unmarshal()