小心指针的陷阱

Tom是指向用户的指针,name=Tom被分配给jackjack,name=jacktom.name被更改为jack。

struct赋值的顺序

虽然年龄在名字之前,因为名字是函数fmt的返回值。Sprintf,初始化user时,成员变量首先是表达式的返回值。

defer panic return的顺序

做点什么-推迟-恐慌

做某事-推迟-返回

json number反射到interface的坑

Json号反映在接口上,所以断言为int是错误的,接口断言为float64。

小心for循环临时变量和goroutine组合的坑

I是一个临时变量。当每一个戈鲁丁都争先恐后地打印I时,结果是不确定的。当每一个葫芦都跑的时候,我现在的样子就会被印出来。

range一个chan的时候,记得在close,不然会deadlock

map是要初始化的,不然会报nil map

从map中取不存在key的时候,返回的是对应的零值

你可以通过if v,ok :=x[' two '];可以判断

byte和rune傻傻分不清楚

Byte表示一个字节,中文为3个字节。符文用于表示Unicode的代码点,即一个字符。

代码块内同名变量的修改,不会影响代码块外的值 //p6.toutiaoimg.com/origin/pgc-image/46c1776ab6084817b85a439436393e48?from=pc">range map是无序的

nil != nil

小心nil != nil的陷阱。golang的interface是由两个部分组成的,{Type, Value},a相当于{nil,nil},b相当于{*int,nil},a自然不等于b。

小心你的类型溢出

这里其实会卡住,首先byte本质是uint8,最大值是255,当到达255后,先加1,就会发生溢出,回到0,所以这行代码本质就是个for{}

给一个已经close的channel发数据会panic

从一个已经close的channel收数据会收到零值

通过context timeout来控制超时

make和new的区别

通过定义可以看出new返回的是指针,make返回的类型的值。make可以是slice、map和chan,new可以new一个类型。

append扩容导致的底层数组的变化

最后一次append,原数组容量不够,重新分配数组。地址变化。

go抢占式调度

在只有一个处理器的情况下,即使一个goroutine是死循环,它也不会一直执行下去

select的随机性

无缓冲和有缓冲的chan的区别

无缓冲的chan,是同步阻塞的,必须存在某个时刻,在写的同时,另一个已经在准备接收了。带缓冲的chan,在缓冲区没满的时候,是不阻塞的。

... 来接收可变长参数

尽量使用小内存字段

根据所需,选择合理的类型,对GC友好。

空struct不占空间

两个无符号的数字最好不要相减,不会得到负数

go的strcut是可以比较的

map、slice、func不可比较,除非是nil

注意close你的http body,防止内存泄露

注册recover,防止panic导致的程序意外退出

go 语句后面的函数调用,其参数会先求值

所以以上会deadlock