Golang:如何通过reflect.Value将string赋值给sql.NullString字段?
解决Golang中反射赋值sql.NullString的问题
要把string类型的inData.SourceId赋值给sql.NullString类型的item.SourceId,在反射场景下不能用SetInt这类基础类型方法——因为sql.NullString是结构体类型,需要构造对应的结构体实例后,通过reflect.Value.Set()方法完成赋值。
修改setField函数中的判断逻辑即可:
func setField(item interface{}, inData interface{}, fieldName string) { itemValue := reflect.ValueOf(item).Elem().FieldByName(fieldName) inDataValue := reflect.ValueOf(inData).Elem().FieldByName(fieldName) if itemValue.Type() == reflect.TypeOf(sql.NullString{}) { // 获取输入的字符串值 strVal := inDataValue.String() // 构造sql.NullString实例 nullStr := sql.NullString{ String: strVal, Valid: strVal != "", // 空字符串时标记为无效,可根据业务需求调整 } // 将构造好的实例赋值给目标字段 itemValue.Set(reflect.ValueOf(nullStr)) } }
关键说明:
- 不要通过字符串类型名判断(比如
itemType == "sql.NullString"),直接用reflect.TypeOf(sql.NullString{})做类型匹配更可靠,避免类型名字符串变化导致判断失效。 itemValue.Set()方法要求传入的reflect.Value类型与目标字段类型完全匹配,因此需要把构造好的sql.NullString转换成reflect.Value后传入。Valid字段的逻辑可按需调整,比如如果业务中空字符串也需要标记为有效,直接将Valid设为true即可。
内容的提问来源于stack exchange,提问作者acaleph
相关产品推荐
相关产品推荐

