go 开发时的一些初级问题
文章目录
【注意】最后更新于 May 7, 2021,文中内容可能已过时,请谨慎使用。
平时碰到的一些小问题, 记一下
1. assignment to entry in nil map, map 赋值问题
|
|
#1
当文件里有一个全局的变量时, 需要先初始化ServiceMp = &ServiceMap{}
一个实体出来#2
在ServiceMap.handlers
这个值添加方法的时候, 不能直接serv.handlers[key] = body
, 而是要先给它赋值一个空的切片,才能往里面加东西, 参考#2.1 和 #2.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 错误
3. xxx.(type) 只能用在 switch 当中, 不想这么写就用 reflect.Typeof(xxx)
4. passes lock by value 使用 mutex 经常碰到
如果传参包含mutex
的时候, 就不能直接传值进去了, 在代码静态检测的时候就会给标出来, 直接值拷贝, 代码在实际运行时也会出现死锁的情况
以下是错误示范:
|
|
应该做的:
|
|
sync 文档 第一段就直说了
Package sync provides basic synchronization primitives such as mutual exclusion locks. Other than the Once and WaitGroup types, most are intended for use by low-level library routines. Higher-level synchronization is better done via channels and communication.
Values containing the types defined in this package should not be copied.
文章作者 GPF
上次更新 2021-05-07 (44e5102)