前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

go坑

原创
作者头像
Michel_Rolle
修改2021-01-22 14:23:09
1.1K0
修改2021-01-22 14:23:09
举报
文章被收录于专栏:golang分享golang分享

go坑

1. for range
  •  for-range其实是语法糖,内部调用还是for循环,初始化会拷贝带遍历的列表(如array,slice,map),然后每次遍历的v都是对同一个元素的遍历赋值。 也就是说如果直接对v取地址,最终只会拿到一个地址,而对应的值就是最后遍历的那个元素所附给v的值。对应伪代码如下:
代码语言:txt
复制
package main

import "fmt"

func main() {
    slice := []int{0, 1, 2, 3}
    myMap := make(map[int]*int)

    for index, value := range slice {
        myMap[index] = &value
    }
   
    prtMap(myMap)
}

func prtMap(myMap map[int]*int) {
    for key, value := range myMap {
        fmt.Printf("map[%v]=%v\n", key, *value)
    }
}

输出

代码语言:txt
复制
map[3]=3
map[0]=3
map[1]=3
map[2]=3

修正

代码语言:txt
复制
package main

import "fmt"

func main() {
    slice := []int{0, 1, 2, 3}
    myMap := make(map[int]*int)

    for index, value := range slice {
        num := value
        myMap[index] = &num  // &slice[index] 也可以,去掉value
    }
    prtMap(myMap)
}

func prtMap(myMap map[int]*int) {
    for key, value := range myMap {
        fmt.Printf("map[%v]=%v\n", key, *value)
    }
}

输出

代码语言:txt
复制
map[2]=2
map[3]=3
map[0]=0
map[1]=1

2. 遍历会停止么
代码语言:txt
复制
v := []int{1, 2, 3}
for i := range v {
    v = append(v, i)
}

【会】,因为遍历前对v做了拷贝,所以期间对原来v的修改不会反映到遍历中

3. 对大数组这样遍历有啥问题?
代码语言:txt
复制
//假设值都为1,这里只赋值3个
var arr = [102400]int{1, 1, 1} 
for i, n := range arr {
    //just ignore i and n for simplify the example
    _ = i 
    _ = n 
}

【有问题】!遍历前的拷贝对内存是极大浪费啊 怎么优化?有两种 - 对数组取地址遍历 for i, n := range &arr - 对数组做切片引用 for i, n := range arr:

4. 零切片和nil切片

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • go坑
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档