2 回答
TA贡献1789条经验 获得超8个赞
1.
正如您从文档中看到的Scanner
,要满足该接口,需要该方法
Scan(src interface{}) error
但你的*Coordinates
类型实现了不同的方法
Scan(value []interface{}) error
类型interface{}
和[]interface{}
是两个截然不同的东西。
2.
Scanner 接口必须在要作为参数传递给 的字段类型上实现rows.Scan
。也就是说,您已经Scan
在 上实现了您的方法*Coordinates
,但 Location 字段的类型是[]Coordinates
。
同样,类型*Coordinates
和类型[]Coordinates
是两个非常不同的东西。
因此,解决方案是在正确的类型上正确实现接口。
请注意,由于 Go 不允许向未命名类型添加方法,并且[]Coordinates
是未命名类型,因此您需要声明一个新类型,然后使用它来代替[]Coordinates
.
type CoordinatesSlice []Coordinates
func (s *CoordinatesSlice) Scan(src interface{}) error {
switch v := src.(type) {
case []byte:
return json.Unmarshal(v, s)
case string:
return json.Unmarshal([]byte(v), s)
}
return errors.New("type assertion failed")
}
// ...
type Business struct {
// ...
Location CoordinatesSlice `json:"location,omitempty"`
// ...
}
笔记
如果业务位置始终只有一对坐标作为 jsonb 对象存储到数据库中,并将类型Location
从更改CoordinatesSlice
为Coordinates
,相应地将Scanner
实现从移动*CoordinatesSlice
到*Coordinates
。
TA贡献1804条经验 获得超7个赞
我知道这个解决方案确实没有优化,但这是唯一有效的方法。
基本上我必须获取 json,然后对 Location 属性进行解组。
var location string = ""
if err := json.Unmarshal([]byte(location), &business.Location); err != nil { panic(err) }
- 2 回答
- 0 关注
- 110 浏览
添加回答
举报