Используйте отражение для заданного значения типа интерфейса - PullRequest
0 голосов
/ 17 мая 2018

У меня есть карта со значением типа interface. Также я хочу использовать этот ключ карты, val для изменения значения в другой функции с отражением.

    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)
            }

        }
    }

но эта ошибка:

не может использовать val (интерфейс типа {}) в качестве типа int64 в аргументе для fieldValue.SetInt: необходимо утверждение типа

не может использовать val (интерфейс типа {}) в качестве строки типа в аргументе fieldValue.SetString: необходимо утверждение типа

1 Ответ

0 голосов
/ 17 мая 2018

Вам необходимо использовать утверждение типа, измените код, как показано ниже:

    if fieldValue.Type().String() == "string" {
        fieldValue.SetString(val.(string))
    }else if fieldValue.Type().String() == "int"{
        fieldValue.SetInt(val.(int64))
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...