doushangxianq07480 2015-11-20 22:57
浏览 56
已采纳

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

If I defined a type type myInt64 int64 how would I set it using reflection? Code below panics reflect.Set: value of type int64 is not assignable to type 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条回答 默认 最新

  • drphfy1198 2015-11-20 23:12
    关注

    You have to provide the correct type for the assignment. There are no implicit type conversions.

    You can either provide a myInt64 to your function

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

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

    Or you can convert the values during assignment

    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?