实现Scan接口将json数组读入map

时间:2017-06-02 07:22:09

标签: arrays json go

我从PostgreSQL中获取一个JSON数组,我想将它读入一个地图。我可以将值解组为Traveller checkin destination ----------- ------------------- ------------------- 4422 Moscow Madrid 4422 Madrid Barcelona 5566 Madrid Barcelona 5566 Barcelona Berlin 5566 Berlin Paris 5566 Paris London 5566 London Madrid 8833 Barcelona Berlin 8833 Berlin London 8833 London Berlin 9966 Paris London 9966 London Berlin 切片,但我真正想要的是[]string

我为该列编写了一个自定义类型,其中包含一个Scan接口,该接口首先将JSON数组转换为字符串切片,然后将每个字符串作为键读取到自定义地图类型中。

map[string]bool

我尝试扫描的查询返回一个带有列值的行,这是一个JSON数组: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"` } ,其中使用自定义类型,如下所示:

["some", "arr", "vals"]

我的预期输出是具有以下形状的结构

var d models.data
sqlDB.QueryRow().Scan(&d.vals)

这编译得很好,但我的代码恐慌“分配到nil map中的条目”

如何修复扫描功能?是否可以使用地图类型执行此操作?

2 个答案:

答案 0 :(得分:2)

您在联合地图上调用git-svn类型的方法Scan。像

一样初始化*custMap
d.vals

d.vals = custMap{}

其他答案已经提供了解释。

答案 1 :(得分:1)

  

The Go Programming Language Specification

     

Map types

     

地图是一种无序的一组元素,称为   元素类型,由一组另一种类型的唯一键索引,称为   关键类型。未初始化地图的值为零。

     

使用内置函数make创建一个新的空映射值   将地图类型和可选容量提示作为参数:

make(map[string]int)
make(map[string]int, 100)
     

初始容量不限制其大小:地图增长以容纳   存储在其中的项目数,但nil地图除外。一个   nil map相当于一个空映射,除了没有元素   加入。

我没有看到make初始化您的地图:" nil地图相当于空地图,但不会添加任何元素。"