golang基础 for遍历注意点
·
-
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)
// }
看一下面也是一个错误案例

更多推荐

所有评论(0)