从项目学习 Golang (5) - JSON 解析, 结构体填充, range interface{}, select channel

接入 Gate.io Websocket 公开接口

根据 JSON 自动生成 struct 结构体定义

工具: JSON-to-GO https://mholt.github.io/json-to-go/

数组的前/后插入数据

1
2
3
4
5
// 在后面插入
arr = append(arr, item)

// 在前面插入
arr = append([item], arr...)

解析 JSON 数组中有不同类型的数据

1
2
3
arr := `["str", 123]`

type Arr []interface{}

参考: http://www.ojit.com/article/195233

将 map[string]interface{} 解析成 struct

从 json 解析出来的对象数据, 经常会出现 map[string]interface{} 类型, 使用第三方包轻松将其转换成指定的 struct 对象

1
2
3
4
5
import "github.com/mitchellh/mapstructure"

var s map[string]interface{}
t := &TargetStructure{}
mapstructure.Decode(s, t)

参考: https://stackoverflow.com/questions/26744873/converting-map-to-struct/26746461

怎么使用 range 循环 interface{}

经常在从 json 转回来的数据是一个 interface{}, 明明就是数组, 为啥直接 for..range 就报错?

1
2
3
4
5
6
7
8
9
10
11
switch t := s.(type) {
case []string:
for _, value := range t {
fmt.Println(value)
}
case []int:
for _, value := range t {
fmt.Println(value)
}
...
}

参考: https://stackoverflow.com/questions/14025833/range-over-interface-which-stores-a-slice

使用 select 阻塞获取 channel 的数据

在 select 阻塞获取数据的时候, 发现只接受到一次数据.

后来发现, 这个 select 外面需要套一层 for {} 死循环

1
2
3
4
5
6
for {
select {
case msg := <-ch:
fmt.Println("recv", msg)
}
}
Donate - Support to make this site better.
捐助 - 支持我让我做得更好.