我试图在Go中创建一个通用方法,该方法将填充struct
来自的使用数据map[string]interface{}
。例如,方法签名和用法可能类似于:
func FillStruct(data map[string]interface{}, result interface{}) {
...
}
type MyStruct struct {
Name string
Age int64
}
myData := make(map[string]interface{})
myData["Name"] = "Tony"
myData["Age"] = 23
result := &MyStruct{}
FillStruct(myData, result)
// result now has Name set to "Tony" and Age set to 23
我知道可以使用JSON作为中介来完成;还有另一种更有效的方法吗?
最简单的方法是使用https://github.com/mitchellh/mapstructure
import "github.com/mitchellh/mapstructure"
mapstructure.Decode(myData, &result)
如果您想自己做,则可以执行以下操作:
http://play.golang.org/p/tN8mxT_V9h
func SetField(obj interface{}, name string, value interface{}) error {
structValue := reflect.ValueOf(obj).Elem()
structFieldValue := structValue.FieldByName(name)
if !structFieldValue.IsValid() {
return fmt.Errorf("No such field: %s in obj", name)
}
if !structFieldValue.CanSet() {
return fmt.Errorf("Cannot set %s field value", name)
}
structFieldType := structFieldValue.Type()
val := reflect.ValueOf(value)
if structFieldType != val.Type() {
return errors.New("Provided value type didn't match obj field type")
}
structFieldValue.Set(val)
return nil
}
type MyStruct struct {
Name string
Age int64
}
func (s *MyStruct) FillStruct(m map[string]interface{}) error {
for k, v := range m {
err := SetField(s, k, v)
if err != nil {
return err
}
}
return nil
}
func main() {
myData := make(map[string]interface{})
myData["Name"] = "Tony"
myData["Age"] = int64(23)
result := &MyStruct{}
err := result.FillStruct(myData)
if err != nil {
fmt.Println(err)
}
fmt.Println(result)
}
问题内容: 我想将一个结构转换为Golang中的地图。如果我可以在创建的地图中使用JSON标签作为键(否则默认为字段名称),那也将很好。 编码愉快!:) 原始帖子 到目前为止,我具有此功能,我正在使用反射包,但我不太了解如何使用该包,请多多包涵。 我也查看了JSON包的源代码,因为它应该包含我所需的实现(或部分实现),但理解得并不多。 问题答案: 我也需要这样的东西。我正在使用将结构转换为地图的内
虽然我们正在为一个特定的(但已经很大的)位置工作,但如果解决方案也能扩展到其他位置就更好了。因为我们只会缓存与系统有关的瓷砖,那么仅仅平铺enitre星球是最好的选择吗?瓦片的尺寸可以用弧秒/分钟来测量,或者这是个坏主意吗? 我们已经使用了Postgres,这似乎可以用PostGIS来完成(这就是光栅吗?),但是在不知道我到底在找什么的情况下跳入文档/教程证明是很困难的。有什么想法吗?
我有这样一个代码: 你能帮我完成代码库吗?
我正在尝试编写代码来掩盖嵌套的json字段。 从...调用此方法。 我在尝试迭代嵌套的json对象时出错... 无法转换scala类型的值。有些要键入scala.collection.mutable.Map 如何以这种方式递归复杂的嵌套json对象?
我正在努力使用Vavr将的减少为一个 有人能提供如何使用/的示例吗?
我有一张这样的地图<代码>地图 钥匙是数字1,2,3,4。。。学生对象是: 我想做的是把它转换成地图 我可以使用这些代码对地图进行分组,但summingDouble不适用于BigDecimal。此外,我无法将我的studentMap转换为StudentInfo地图:( 我的学生信息对象是: