如何在Go中使用基类型设置struct字段

时间:2015-11-20 22:57:24

标签: go

如果我定义了类型type myInt64 int64,我将如何使用反射设置它?代码如下panics 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)
}

1 个答案:

答案 0 :(得分:3)

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

您可以为您的功能提供myData := make(map[string]interface{}) myData["Name"] = "Tony" myData["Age"] = myInt64(23)

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

    val := reflect.ValueOf(value)

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

sustainable rate

或者您可以在分配期间转换值

{{1}}

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