go - 对接口(interface)类型的设置值使用反射

标签 go

我有一个接口(interface)类型值的映射。我还想使用这个映射键,val 来改变另一个 func 中的值。

    func main(){
        ValueForUpdate := make(map[string]interface{})
        ValueForUpdate["DeliveryCount"] = 2 //type int
        ValueForUpdate["BulkId"] = "100200300"  //type string

        UpdateSendTBL(ValueForUpdate)
    }

    func UpdateSendTBL(keyNewVal map[string]interface{}){
        get := // some data
        rowValue := reflect.ValueOf(get).Elem()
        for key, val := range keyNewVal {
            fieldValue := rowValue.FieldByName(key)
            if fieldValue.Type().String() == "string" {
                fieldValue.SetString(val)
            }else if fieldValue.Type().String() == "int"{
                fieldValue.SetInt(val)
            }

        }
    }

但是这个错误:

cannot use val (type interface {}) as type int64 in argument to fieldValue.SetInt: need type assertion

cannot use val (type interface {}) as type string in argument to fieldValue.SetString: need type assertion

最佳答案

需要使用类型断言,修改代码如下:

    if fieldValue.Type().String() == "string" {
        fieldValue.SetString(val.(string))
    }else if fieldValue.Type().String() == "int"{
        fieldValue.SetInt(val.(int64))
    }

关于go - 对接口(interface)类型的设置值使用反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50386888/

相关文章:

go - 从容器内运行的应用程序使用 Gmail API

json - 在 Golang 中解析 JSON 以绘制多边形

http - 第一次循环迭代后无效的内存地址或零指针取消引用

serialization - Golang 序列化和反序列化

go - 将自纪元以来的时间转换为十六进制或字节数组

android - 在 Mac for Android 上交叉编译 "Hello World"

arrays - 在运行时填充长度设置的 slice 时,我是否绝对需要两个循环,一个用于确定长度,一个用于填充?

mysql - go-sql-driver/mysql - 将 float64 插入 mariadb(双列)给出不受支持的类型 func() float64,一个 func

arrays - 在 golang 中循环遍历数组对象和分组的最佳方法

go - 将 IPMask 转换为 IPAddr