原创

go坑

go坑

1. for range

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

输出

map[3]=3
map[0]=3
map[1]=3
map[2]=3

修正

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)
    }
}

输出

map[2]=2
map[3]=3
map[0]=0
map[1]=1

2. 遍历会停止么

v := []int{1, 2, 3}
for i := range v {
    v = append(v, i)
}

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

3. 对大数组这样遍历有啥问题?

//假设值都为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切片

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go 中的坑

    defer 执行顺序是先进后出,栈的方式 FIFO ,参数的值在 defer 语句执行就已经确定了

    王小明_HIT
  • Go Modules踩坑总结

    在 Java 的项目中,有 Maven 和 Gradle 这些很好用的依赖版本管理工具,简直不要太方便了,但是在 Golang 的项目中,之前的 Golang ...

    张乘辉
  • go语言坑之for range

    songleo
  • Go采坑记: sync.WaitGroup 指针引用问题

    WaitGroup:主要包括Add,Done,Wait三个方法,Add表示添加一个goroutine,Done等于Add(-1),表示一个goroutine结束...

    机械视角
  • 关于go get的巨坑

    然后就是还是下载不下来,于是想着用git clone来下载,还是下载不下来,每次都断掉,可以在git clone后面加–depth=1

    陨石坠灭
  • Go语言常见坑

    这里列举的Go语言常见坑都是符合Go语言语法的, 可以正常的编译, 但是可能是运行结果错误, 或者是有资源泄漏的风险。

    我的小碗汤
  • go mod使用踩坑

    尝试使用了go mod去管理包,按照官方的文档指引https://blog.golang.org/using-go-modules进行实践。 整个过程中出现了几...

    槽痞
  • Go语言常见坑

    这里列举的Go语言常见坑都是符合Go语言语法的,可以正常的编译,但是可能是运行结果错误,或者是有资源泄漏的风险。

    码农编程进阶笔记
  • Go采坑记: Golang 空接口的小技巧应用

    最近在用golang写一个框架,希望可以比较灵活地构建一个方法,可以接受任意类型的输入,这样首先想到的是使用空接口interface{},因为在golang里面...

    机械视角
  • go踩坑指南:修改slice里的struct类型的元素不生效?

    slice数据结构里,包含指向底层array的指针。slice作为参数传递时,实际是创建了一个新的slice对应,同时将原slice对应的array指针copy...

    hugo_lei
  • go语言坑之并发访问map

    songleo
  • go语言坑之list删除所有元素

    songleo
  • 从入门到掉坑:Go 内存池/对象池技术介绍

    ? 作者:deryzhou,腾讯 PCG 后台开发工程师 Go 中怎么实现内存池,直接用 map 可以吗?常用库里 GroupCache、BigCache ...

    腾讯技术工程官方号
  • 从bug中学习:六大开源项目告诉你go并发编程的那些坑

    ? 导语 | 并发编程中,go不仅仅支持传统的通过共享内存的方式来通信,更推崇通过channel来传递消息,这种新的并发编程模型会出现不同于以往的bug。从b...

    腾小云
  • 干货满满的 Go Modules 和 goproxy.cn

    大家好,我是一只普通的煎鱼,周四晚上很有幸邀请到 goproxy.cn 的作者 @盛傲飞(@aofei) 到 Go 夜读给我们进行第 61 期 《Go Modu...

    madneal
  • GO语言版鹅厂广告交易实时平台价格解析

    腾讯广告实时交易平台在向竞价胜出一方返回成交价的时候,先对价格进行TEA加密,再对密文进行BASE64编码,接收方先对BASE64解码,再对密文解密,双方事先...

    用户1263954
  • go语言中的数组切片:特立独行的可变数组

    初看go语言中的slice,觉得是可变数组的一种很不错的实现,直接在语言语法的层面支持,操作方面比起java中的ArrayList方便了许多。但是在使用了一段时...

    李海彬
  • 开发者的福音,go也支持linq了

    go在进行集合操作时,有很不舒服的地方,起初我真的是无力吐槽,又苦于找不到一个好的第三方库,只能每次写着重复代码。举个栗子

    happlyfox
  • C++像Go一样的并发与闭包

    并发性是程序的一种属性,其中两个或多个任务可以同时进行。并行性是一个运行时属性,其中两个或多个任务同时执行。通过并发性,为程序定义一个适当的结构。并发可以使用并...

    公众号guangcity

扫码关注云+社区

领取腾讯云代金券