1. for i 遍历注意 

如果我们的字符串含有中文,那么传统的遍历字符串方式,就是错误,会出现乱码。原因是传统的对字符串的遍历是按照字节来遍历,而一个汉字在 utf8 编码是对应 3 个字节!

解决方案 如下两种

2.for rang 遍历注意

for-range可以用来历容器类型如数组、切片和映射,channel 。但是使用for-range时,如果使用不当会程序运行不是预期结果,
//例如,下面的示例程序将遍历一个切片,并将切片的值当成切片值存入,切片类型是一个结构体,切片的类型是为Point型,值是一个地址。

type Point struct {
	x int
	y int
}

func main() {
	r := make([]*Point, 4)
	d := []Point{
		{1, 3},
		{3, 3},
		{3, 48},
		{8, 2},
	}
	for _, v := range d {
		r = append(r, &v)
	}
	for _, v := range r {
		log.Println(*v)
	}
}
//  我们希望结果是
//2018/10/08 22:44:50 {1 3}
//2018/10/08 22:44:50 {3 3}
//2018/10/08 22:44:50 {3 48}
//2018/10/08 22:44:50 {8 2}

//  但是实际运行是这样的
//2018/10/08 22:44:50 {8 2}
//2018/10/08 22:44:50 {8 2}
//2018/10/08 22:44:50 {8 2}
//2018/10/08 22:44:50 {8 2}

//由输出可以知道,程序取最后迭代的值写入。经过debug发现,原来for-range 时 v 是复制切片的的值,然而v的指针地址是没变的。
//所以迭代完成的时候,因为读取的v的指针,v的地址被写入,装入的值也是最后迭代的值。正确程序如下:
//	for _, v := range d {
//		vv := v
//		r = append(r, &vv)
//	}

看一下面也是一个错误案例

更多推荐