golang中是否有类似于sql.NullString的sql.NullJson?

golang中是否有类似于sql.NullString的sql.NullJson?,go,Go,我使用golang从postgres查询,其中一个字段包含json,有时可能是NULL 像这样 row := db.QueryRow( "select my_string, my_json from my_table where my_string = $1", my_id) var my_string sql.NullString var myjson MyJsonStruct err := row.Scan(&my_string2, &myjson) 但是

我使用golang从postgres查询,其中一个字段包含
json
,有时可能是
NULL

像这样

row := db.QueryRow(
    "select my_string, my_json from my_table where my_string = $1",
   my_id)


var my_string sql.NullString
var myjson MyJsonStruct
err := row.Scan(&my_string2, &myjson)
但是我越来越

sql:column index 2上的扫描错误,名称为“my_json”:不支持的扫描,将driver.Value类型存储到type*main.MyJsonStruct中


我检查了
https://godoc.org/database/sql
但是没有找到
sql.NullJson
处理这种情况的方法是什么?

不,没有sql.json。我认为在db中处理json列的最好方法是实现valuer和scanner。比如说:

// Scan implements database/sql.Scanner interface
func (m *MyJsonStruct) Scan(src interface{}) error {
    if src == nil {
        return nil
    }
    data, ok := src.([]byte)
    if !ok {
        return errors.New("type assertion to []byte failed")
    }
    var myJsonStruct MyJsonStruct
    if err := json.Unmarshal(data, &myJsonStruct); err != nil {
        return fmt.Errorf("unmarshal myJsonStruct: %w", err)
    }
    *m = myJsonStruct
    return nil
}

// Value implements database/sql/driver.Valuer interface
func (m MyJsonStruct) Value() (driver.Value, error) {
    data, err := json.Marshal(m)
    if err != nil {
        return nil, fmt.Errorf("marshal myJsonStruct: %w", err)
    }
    return data, nil
}


不,没有sql.json。我认为在db中处理json列的最好方法是实现valuer和scanner。比如说:

// Scan implements database/sql.Scanner interface
func (m *MyJsonStruct) Scan(src interface{}) error {
    if src == nil {
        return nil
    }
    data, ok := src.([]byte)
    if !ok {
        return errors.New("type assertion to []byte failed")
    }
    var myJsonStruct MyJsonStruct
    if err := json.Unmarshal(data, &myJsonStruct); err != nil {
        return fmt.Errorf("unmarshal myJsonStruct: %w", err)
    }
    *m = myJsonStruct
    return nil
}

// Value implements database/sql/driver.Valuer interface
func (m MyJsonStruct) Value() (driver.Value, error) {
    data, err := json.Marshal(m)
    if err != nil {
        return nil, fmt.Errorf("marshal myJsonStruct: %w", err)
    }
    return data, nil
}


接口是不必要的,对吗?如果我使用json:“我的字段名称”yes,那么它是不必要的。仅当您需要存储值时才执行此操作
接口不是必需的,对吗?如果我使用json:“我的字段名称”yes,那么它是不必要的。仅当您需要存储值时才实施它