Go 开发时的一些初级问题

平时碰到的一些小问题, 记一下

assignment to entry in nil map, map 赋值问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

// ServiceMap 可用服务列表
type ServiceMap struct {
handlers map[string]BaseClient
RWLock sync.RWMutex
BaseService
}

var ServiceMp *ServiceMap

func init() {

// #1
ServiceMp = &ServiceMap{}
// #2.1
ServiceMp.handlers = make(map[string]BaseClient)

ServiceMp.AddMethod("XyToken", BaseClient{
Module: "System",
Class: "XyToken",
Func: "getXyOpenKey",
})

log.Println("get method:", ServiceMp.handlers)

}

// AddMethod 添加方法
func (serv *ServiceMap) AddMethod(key string, body BaseClient) (err error) {
defer func() {
if err := recover(); err != nil {
log.Println("AddMethod error:", err)
}
}()

if _, ok := serv.handlers[key]; !ok {
serv.RWLock.Lock()
// #2.2
serv.handlers[key] = body
serv.RWLock.Unlock()
}

return nil
}
  • #1 当文件里有一个全局的变量时, 需要先初始化 ServiceMp = &ServiceMap{} 一个实体出来
  • #2ServiceMap.handlers这个值添加方法的时候, 不能直接 serv.handlers[key] = body, 而是要先给它赋值一个空的切片,才能往里面加东西, 参考 #2.1 和 #2.2

interface conversion: interface {} is float64, not int

通常json 转成 map[string]interface{} 时,数字类型就是float64的,

比如:想把它转成int类型使用就要auth.Sys = int(sys.(float64))这样(sys 就是一个 interface{} 类型的数字), 而不是auth.Sys = sys.(int), 后一种写法会有 painc 错误

xxx.(type) 只能用在 switch 当中, 不想这么写就用 reflect.Typeof(xxx)