我从PostgreSQL获取一个JSON数组,我想将它读入一个 Map . 我能够将值解组为 []string
切片,但我真正想要的是 map[string]bool
.
我已经为列编写了一个自定义类型,其中的Scan接口首先将JSON数组转换为字符串切片,然后将每个字符串作为键读取到自定义 Map 类型中 .
type custMap map[string]bool
func (m *custMap) Scan(src interface{}) error {
b, ok := src.([]byte)
if !ok {
return error(errors.New("Error Scanning Array"))
}
s := make([]string, 0)
json.Unmarshal(b, &s)
for _, v := range s {
(*m)[v] = true
}
return nil
}
type data struct {
vals custMap `json: "vals"`
}
我尝试扫描的查询返回一个列为vals的行,这是一个JSON数组: ["some", "arr", "vals"]
,其中使用自定义类型,如下所示:
var d models.data
sqlDB.QueryRow().Scan(&d.vals)
我的预期输出是具有以下形状的结构
{ vals: map[string]bool { "some": true, "arr": true, "vals": true }
这编译很好,但我的代码恐慌与“分配到零 Map 中的条目”
如何修复扫描功能?是否可以使用 Map 类型执行此操作?
2 回答
您正在单一化 Map 上调用
*custMap
类型的方法Scan
. 初始化d.vals
或者像要么
其他答案已经提供了解释 .
我没有看到
make
初始化你的 Map :“一个nil
Map 相当于一个空 Map ,只是没有添加任何元素 . ”