go for range坑和闭包坑

golang range + 闭包 golang中 range + 闭包 都有一些容易搞错的点,混在一起就更容易搞错了,记一个例子 1、range:遍历的时候keyvalue都是同一个地址,然后把要遍历的对应的值塞进来,如果遍历过程中用到了这个地址,那将是同一个地址。 link 2、闭包引用外部变量,会在真正调用的时候根据外部变量的值做出改变 link 结合在一起的一个测试用例 type Res struct { ID int `json:"id"` InitFunc func(*Res) erro 阅读详情

       看程序:

package main
import (
    "fmt"
    "time"
)
func main()  {
    str := []string{"I","like","Golang"}

    for _, v := range str{
    	 v += "good"
    }

    for k, v := range str{
    	 fmt.Println(k, v)
    }
    
    time.Sleep(1e9)
}

       结果:

0 I
1 like
2 Golang

     想一想,为什么。

 

     再看:

package main
import (
    "fmt"
    "time"
)
func main()  {
    str := []string{"I","like","Golang"}

    for k, v := range str{
    	 fmt.Println(&k, &v)
    }
    
    time.Sleep(1e9)
}

      结果:

0xc000012050 0xc00000e1e0
0xc000012050 0xc00000e1e0
0xc000012050 0xc00000e1e0

     想一想,为什么。

 

     再看:

package main
import (
    "fmt"
    "time"
)
func main()  {
    str := []string{"I","like","Golang"}

    for k, v := range str{
    	str = append(str, "good")
    	fmt.Println(k, v)
    }
    
    time.Sleep(1e9)
}

     结果:

0 I
1 like
2 Golang

     想一想, 为什么。

 

     再看:

package main
import (
    "fmt"
    "time"
)
func main()  {
    str := []string{"I","like","Golang"}

    for k, v := range str{
    	go func(i int, s string){
    	  fmt.Println(i, s, k, v)
    	}(k, v)
    }
    
    time.Sleep(1e9)
}

       结果:

0 I 2 Golang
1 like 2 Golang
2 Golang 2 Golang

      想一想,为什么。

 

      最后再看:

package main
import (
    "fmt"
    "time"
)
func main()  {
    str := []string{"I","like","Golang"}

    for k, v := range str{
    	go func(i int, s string){
    	  fmt.Println(i, s, k, v)
    	}(k, v)

    	time.Sleep(1e9)
    }
    
    time.Sleep(5e9)
}

     结果:

0 I 0 I
1 like 1 like
2 Golang 2 Golang

     想一想,为什么。

 

     不多说。

 

 

 

golang-for range golang中,常用的遍历方式有经典的for循环for range两种。实际上,使用 for range 语法的控制结构最终应该也会被golang的编译器转换成普通的 for 循环,所以for range实际上会被先转换成经典的for循环再真正执行,而正是这个转换过程常常会留。 下面简单表示这个转换过程: for range代码是: for index, value := range t_slice { original body } 转换后: len_temp := len(t_slice) ra 阅读详情

相关推荐

GO语言基础教程(41)Go循环语句之for-range循环:Go语言for-range循环:遍历数据的瑞士军刀

Go语言中的for-range循环是遍历各类数据结构的全能选手,它简洁高效但暗藏陷阱。本文带你深入探索for-range的妙用,从基本操作到底层原理,再到常见位解析,让你彻底掌握这把Go语言中的迭代利器,写出更优雅安全的代码。

jxf_jxfcsdn的博客 740

go for range闭包的分析

今天小编就为大家分享一篇关于go for range闭包的分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

Go控制结构:if、for、switch的那些

if记住不用括号初始化语句,for记住三种形态range值拷贝的问题,switch记住默认不穿透fallthrough的无条件穿透行为。控制结构本身不难,难在跟其他语言的习惯不一样,肌肉记忆会帮你写错。下一篇讲函数,Go的函数支持多返回值命名返回值,闭包也是重点,里面的比控制结构还多。

白话机器学习 176

Golang原理分析:闭包for range延迟绑定问题原理及解决

当一个函数引用了环境的变量,被引用的变量与该函数同时存在组成的系统,被称为闭包

BoringError的博客 1667

Go for range 一不小心就掉里了

for循环问题,在面试中经常都会被问到,并且在实际业务项目中也经常用到for循环,要是没用好,一不下心就掉。前言为了让大家更好的理解本期知识点,先介绍以下几个知识点:线性结构、非线性结构、循环、迭代、遍历、递归。线性结构:数组、队列非线性结构:树、图循环(loop):最基础的概念,所有重复的行为都是循环递归(recursion):在函数内调用自身,将复杂情况逐步转化成基本情况(数学)迭代(ite...

王中阳讲编程 352

Go 语言中 for range闭包的陷阱及详细解释

闭包是一个函数其周围的状态(词法环境)的组合。在 Go 中,闭包通常是指一个匿名函数,它可以捕获外部变量的值。例如:go复制在上述代码中,makeAdder返回了一个闭包,该闭包捕获了变量base,并可以在后续调用中使用它。在for range循环变量的作用域:循环变量的作用域是整个循环体,闭包捕获的是变量的引用,而不是值。陷阱表现:所有闭包可能捕获的是同一个变量的最终状态,而不是每次迭代时的值。解决方法在循环中创建局部变量副本。使用索引访问原始集合的元素。使用立即执行的闭包捕获当前值。

qq_38609643的博客 980

Go语言循环的,你踩过多少?

Go 1.22之前通过遍历切片取不到所有变量的地址,而是同一个临时变量的地址闭包中的迭代变量:迭代变量在闭包中被捕获,导致所有闭包共享同一个变量。for range会创建元素的副本,直接修改迭代变量不会影响原切片。字典遍历顺序:遍历字典时,顺序是随机的,每次运行可能不同。for range遍历字符串时返回的是Unicode代码点(rune),而不是字节,可能导致多字节字符处理复杂。删除切片元素: 在for range中删除切片元素可能导致意外行为或漏掉某些元素。遍历修改映射(字典):在。

IT杨秀才的博客 1294

Golang常见面试题

Golang常见面试题

J_Lee 4643

Golang 中关于闭包

所谓闭包是指内层函数引用了外层函数中的变量或称为引用了自由变量的函数,其返回值也是一个函数,了解过的语言中有闭包概念的像 js,python,golang 都类似这样。 python 中的闭包可以嵌套函数,像下面这样: def make_adder(addend): def adder(augend): return augend + addend ...

weixin_30735745的博客 136

Golang for range

https://blog.csdn.net/somanlee/article/details/107881231

ALakers的博客 575

golang闭包里的

介绍 go闭包是一个很有用的东西。但是如果你不了解闭包是如何工作的,那么他也会给你带来一堆的bug。这里我会拿出Go In Action这本书的一部分代码,来说一说在使用闭包的时候可能遇到的。全部的代码在github上。   闭包 首先看一段代码: search/search.go 29 // Launch a goroutine for each feed to f

future_challenger的专栏 3284

golang学习之七:for 语句的常见“”与避方法

1.凡是用到for-range的地方一定要小心2.凡是用到闭包的地方,参数取值或传参一定要小心3.go方法的本质,也就是 一个以方法的receiver参数作为第一个参数的普通函数4.for-range的时候,如果调用闭包千千万万要看清在将函数注册到函数栈上时有没有注册参数:若有:则注意参数的类型是指针还是非指针。若没有:那么函数运行时,就找闭包函数之外的变量运行了,注意此时变量的值。

java_xxxx的博客 1926

For range 循环中的指针

特性Go < 1.22Go 1.22+变量作用域整个循环 (Per-loop)每次迭代 (Per-iteration)内存地址所有迭代共享同一个地址每次迭代有独立地址闭包捕获捕获的是引用,全是最后的值捕获的是当次迭代的值最佳实践需要v := v直接使用。

qq_45490502的博客 1063

golang的闭包内引用值range实现

问题描述 一个简单的遍历功能 func demo0(){ // 顺序遍历, i,a 地址不变, 值变化 arr := []string{"dog", "cat", "mouse"} for i, a := range arr{ fmt.Printf("func %d get %s\n", i, a) } } 输出: func 0 get dog func 1 get cat func 2 get mouse 然后想要通过goroutine来完成并发 func demo2(){ arr :=

Chrispink 740

go语言闭包

go语言困惑已久的闭包问题及牛客网做题的理解

weixin_45904051的博客 1106

golang的for range原理以及引致的一些奇怪问题

基本用法 下述两个函数test1与test2运行结果有何区别? func test1() { intArray := []int{1, 2, 3, 4} for _, val := range intArray { val++ } // 仍然为[1, 2, 3, 4] fmt.Println(intArray) } func test2() { intArray := []int...

jason_cuijiahui的博客 1978
上一篇: 善良比聪明更重要吗?选择比努力更重要吗?------顺便扯淡下爱因斯坦狭义相对论之“同时”的相对性
下一篇: 诡辩逻辑很常见:(没有)真正的苏格兰人
涛歌依旧
涛歌依旧 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄14年 28万+粉丝 2592原创
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值