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

Kru*_*rut 4 go

如果我定义了一个类型type myInt64 int64,我将如何使用反射来设置它?恐慌下面的代码反映.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)
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*imB 5

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

您可以myInt64为您的功能提供一个

myData := make(map[string]interface{})
myData["Name"] = "Tony"
myData["Age"] = myInt64(23)
Run Code Online (Sandbox Code Playgroud)

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))
}
Run Code Online (Sandbox Code Playgroud)

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