Go新手应该注意的几点

原创
2017/12/29 10:30
阅读数 148

1. 使用go启动一个协程的时候,需要保证整个进程结束前协程能够执行结束,否则没等协程执行结束就退出,会造成很多问题。

2. go的panic为导致整个进程的推出,用go做服务时,注意需要有一个自动重启的服务的脚本。

3. go的map类型是不支持并发读写的,1.9版本以上可以使用sync.Map代替,1.9以下可以自己控制读写锁。

4. go的map相互赋值a:=b,b如果是map类型,则a是b的指针引用,改变a的值事同时也会改变b的值。所以复制一个map是不能直接赋值的。

5. 断言注意类型,不然也会导致程序panic。

6. 切片,map使用应该都要进行内存分配,比如

var m map[string]string
// m := map[string]string{} 正常
// m := make(map[string]string) 正常
m["d"] = "1"

这样会抛出panic: assignment to entry in nil map.

7. 断言switch语句的不能直接强制类型转换,如:

package main

import (
	"fmt"
	"reflect"
)

func main() {
		var m interface{}
		m = float64(10)
		fmt.Println(reflect.TypeOf(m))
		switch n := m.(type) {
		case int,float64:
			fmt.Println(reflect.TypeOf(n))
			fmt.Println(n == 10) //这里float64是不等于10的,各语言都有这样的坑,避免不了
			fmt.Println(int(n) == 10) //然后我们想到强制转换,然而这样编译器不通过cannot convert n (type interface {}) to type int: need type assertion
            // 当然你去掉case 的int也是不行的
		}
}

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
1 收藏
0
分享
返回顶部
顶部