Go 语言错误集锦

错误的Channel使用

代码:

错误代码

问题:

报错信息

解决:
参考网址: https://segmentfault.com/q/1010000007528186
死锁了,看上去没什么问题啊!--新手的一个坑!

其实是对 channel 的理解与使用有误区!

defer 调用可能会“篡改”输出结果,参考如下:


func main() {
	v := testDefer001(1, 2)
	fmt.Printf("%v\n", v)
	// out:
	// 	999
}

func testDefer001(x int, y int) (z int) {
	/*返回的是命名参数,在 defer 中可以直接访问并“篡改”*/
	defer func() {
		z = 999
	}()
	/*虽然这里计算的结果是3,但在defer中被“篡改”了,使用时要注意*/
	z = x + y
	return
}

defer 定义形式

直接调用命名函数,定义时就把需要的参数值做了一个拷贝,后续不影响defer中相应的值
defer与匿名函数,是否定义传递参数时的区别,如果传递,则在定义时会拷贝一份到匿名函数内;如果不传递,则执行时从context中查找