相关疑难解决方法(0)

在Golang中将结构转换为map的函数

我想在Golang中将结构转换为map.如果我可以将JSON标记用作创建的映射中的键(否则默认为字段名称),这也是很好的.

编辑TL; DR版本,2015年6月15日

如果您想要将结构转换为映射的快速解决方案,请参阅接受的答案,对其进行upvote并使用该包.

快乐的编码!:)


原帖

到目前为止我有这个功能,我正在使用反射包但我不明白如何使用该包,请耐心等待.

func ConvertToMap(model interface{}) bson.M {
    ret := bson.M{}

    modelReflect := reflect.ValueOf(model)

    if modelReflect.Kind() == reflect.Ptr {
        modelReflect = modelReflect.Elem()
    }

    modelRefType := modelReflect.Type()
    fieldsCount := modelReflect.NumField()

    var fieldData interface{}

    for i := 0; i < fieldsCount; i++ {
        field := modelReflect.Field(i)

        switch field.Kind() {
        case reflect.Struct:
            fallthrough
        case reflect.Ptr:
            fieldData = ConvertToMap(field.Interface())
        default:
            fieldData = field.Interface()
        }

        ret[modelRefType.Field(i).Name] = fieldData
    }

    return ret
}
Run Code Online (Sandbox Code Playgroud)

另外我查看了JSON包源代码,因为它应该包含我需要的实现(或部分内容)但不太了解.

go

49
推荐指数
4
解决办法
6万
查看次数

使用 Gorm 更新为 0 值

我正在尝试使用 gorm 库更新一些值,但值为 0 的字节和整数未更新

var treatment model.TreatmentDB

err = json.Unmarshal(b, &treatment)
if err != nil {
    http.Error(w, err.Error(), 500)
    return
}

fmt.Println(&treatment)

db := db.DB.Table("treatment").Where("id = ?", nID).Updates(&treatment)
Run Code Online (Sandbox Code Playgroud)

这个打印值是{0 3 1 0 0 0 2018-01-01 4001-01-01},那些0是未更新的字节值(数据库中的tinyint(1),如果我更改为int也不起作用) ,其余值工作正常

如果我在不使用 Gorm 的情况下更新它们,它可以完美地使用 0 值

var query  = fmt.Sprintf("UPDATE `pharmacy_sh`.`treatment` SET `id_med` = '%d', `morning` = '%d', `afternoon` = '%d', `evening` = '%d', `start_treatment` = '%s', `end_treatment` = '%s' WHERE (`id` = '%s')", treatment.IDMed, treatment.Morning,  treatment.Afternoon, treatment.Evening, treatment.StartTreatment, treatment.EndTreatment, nID)

update, err …
Run Code Online (Sandbox Code Playgroud)

mysql go go-gorm

6
推荐指数
1
解决办法
1万
查看次数

标签 统计

go ×2

go-gorm ×1

mysql ×1