go - 如何在 Go 中使用基类型设置结构字段

标签 go

如果我定义了一个类型 type myInt64 int64 我将如何使用反射来设置它?下面的代码 panic reflect.Set:int64 类型的值不可分配给 main.myInt64 类型 http://play.golang.org/p/scsXq4ofk6

package main

import (
    "fmt"
    "reflect"
)

type myInt64 int64

type MyStruct struct {
    Name string
    Age  myInt64
}

func FillStruct(m map[string]interface{}, s interface{}) error {
    structValue := reflect.ValueOf(s).Elem()

    for name, value := range m {
        structFieldValue := structValue.FieldByName(name)

        val := reflect.ValueOf(value)

        structFieldValue.Set(val)
    }
    return nil
}

func main() {
    myData := make(map[string]interface{})
    myData["Name"] = "Tony"
    myData["Age"] = int64(23)

    result := &MyStruct{}
    err := FillStruct(myData, result)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(result)
}

最佳答案

您必须为作业提供正确的类型。没有隐式类型转换。

你可以为你的函数提供一个myInt64

myData := make(map[string]interface{})
myData["Name"] = "Tony"
myData["Age"] = myInt64(23)

http://play.golang.org/p/sbOdAnbz8n

或者你可以在赋值时转换值

for name, value := range m {
    structFieldValue := structValue.FieldByName(name)
    fieldType := structFieldValue.Type()

    val := reflect.ValueOf(value)

    structFieldValue.Set(val.Convert(fieldType))
}

http://play.golang.org/p/kl0fEENY9b

关于go - 如何在 Go 中使用基类型设置结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33837440/

相关文章:

go - 使用Go的base64.StdEncoding.Decode()方法: how to choose the size of the destination byte slice?

regex - 如何在正则表达式中使整个单词可选?

go - 如何在内部完全停止 goroutines 错误

json - Golang中的Encode Set数据结构

linux - Go 代码构建错误,标准包中的非标准导入 "fmt",导入周期不允许

go - 如何创建动态类型的变量

mysql - 批量 MySQL 插入比 PHP 慢 2 倍

map - 你如何将 TCP 连接对象传递给其他 Go 模块?

json - 从压缩的 HTTP : invalid character looking for beginning of value 中解码 JSON

go - 为什么在那种特殊情况下 gccgo 比 gc 慢?