golang闭包和range

Posted 9527s

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang闭包和range相关的知识,希望对你有一定的参考价值。

遇到经典问题

func mian()  {
	resslice := []int{1, 2, 3, 4}
	for _, v := range resslice {
		fmt.Println(v)
		defer fun1(v)

	}

}

func fun1(value int)  {
	fmt.Println(value)

}

  输出结果为

1
2
3
4
4
3
2
1

正常传递参数,值传递,运行到defer时把当时的v值传递给函数,最后结束时按defer规律执行

 

resslice := []int{1, 2, 3, 4}
	for _, v := range resslice {
		fmt.Println(v)
		defer func() {
			fmt.Println(v)
		}()

	}

  改为闭包输出结果为

1
2
3
4
4
4
4
4

 

for range的内部大概是这样

for_temp := v
len_temp := len(for_temp)
for index_temp = 0; index_temp < len_temp; index_temp++ {
        value_temp = for_temp[index_temp]
        index = index_temp
        value = value_temp
        v = append(v, index)
}

  循环前把值复制给 for_temp 然后用同一个变量进行赋值

因为闭包里的非传递参数外部变量值是传引用的,是闭包是地址引用

闭包的v 引用外部变量v,把外部的v地址拷贝了一份,执行到最后v的值是4,所以最后输出为连续的4

 

以上是关于golang闭包和range的主要内容,如果未能解决你的问题,请参考以下文章

golang 闭包

11-Groovy-Closures(闭包)和Ranges(范围)

第一章.java&golang的区别之:闭包

golang goroutine例子[golang并发代码片段]

Golang 中关于闭包的坑

golang代码片段(摘抄)