栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

golang在嵌套结构中解码JSON请求并将其作为blob插入DB

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

golang在嵌套结构中解码JSON请求并将其作为blob插入DB

这取决于您用来与数据库进行对话的内容,但是如果您正在使用

database/sql
并且提供了对此提供支持的驱动程序,则可以让您的
Contract
类型实现Valuer接口。

type Service struct {    ID       string    `json:"id,omitempty" db:"id"`    Name     string    `json:"name" db:"name"`    Contract Contract `json:"contract" db:"contract"`}type Contract struct {    ServiceTime int    `json:"service_time"`    Region      string `json:"region"`}func (c *Contract) Value() (driver.Value, error) {    if c != nil {        b, err := json.Marshal(c)        if err != nil { return nil, err        }        return string(b), nil    }    return nil, nil}

然后,当您执行查询时,只需在

Service.Contract
字段中传递,驱动程序应调用该
Value
方法。

sql := // INSERT INTO ...svc := // &Service{ ...db.Exec(sql, svc.ID, svc.Name, svc.Contract)

为了能够从db中检索blob并将其解组,

Contract
您可以再次实现Scanner接口,如果类型实现了该目标,则驱动程序应该调用它。

func (c *Contract) Scan(src interface{}) error {    var data []byte    if b, ok := src.([]byte); ok {        data = b    } else if s, ok := src.(string); ok {        data = []byte(s)    }    return json.Unmarshal(data, c)}// ...sql := // SELECt * FROM ...svc := // &Service{ ...db.QueryRow(sql, 123).Scan(&svc.ID, &svc.Name, &svc.Contract)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484352.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号