首页 文章

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

提问于
浏览
0

我从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 回答

  • 1

    您正在单一化 Map 上调用 *custMap 类型的方法 Scan . 初始化 d.vals 或者像

    d.vals = custMap{}
    

    要么

    d.vals = make(custMap)
    

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

  • 2

    Go编程语言规范映射类型映射是一种类型的无序元素组,称为元素类型,由一组另一种类型的唯一键索引,称为键类型 . 未初始化的 Map 的值为零 . 使用内置函数make创建一个新的空映射值,它将map类型和可选容量提示作为参数:make(map [string] int)
    make(map [string] int,100)
    初始容量不限制其大小:映射增长以容纳存储在其中的项目数,但nil映射除外 . 零 Map 等同于空 Map ,但不能添加任何元素 .

    我没有看到 make 初始化你的 Map :“一个 nil Map 相当于一个空 Map ,只是没有添加任何元素 . ”

相关问题