我是靠谱客的博主 发嗲故事,最近开发中收集的这篇文章主要介绍Go语言关于for range的案例分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

直接开始吧:

func main() {
	var a = [5]int{1, 2, 3, 4, 5}
	var r [5]int

	for i, v := range a {
		if i == 0 {
			a[1] = 12
			a[2] = 13
		}
		r[i] = v
	}
	fmt.Println("r = ", r)
	fmt.Println("a = ", a)
}

输出:

r =  [1 2 3 4 5]
a =  [1 12 13 4 5]

开始逐个分析:
首先定义了一个int类型的数组长度为5并对这个数组进行赋值,接着再定义了一个数组,长度也是5,不过这个没有赋值。然后是一个
for range ,我们知道for range的时候是一个原数据的副本,所以此时遍历的是只是a这个数组的值的副本,那既然只是值的副本那就跟a没有一毛钱关系了,所以遍历之后每次塞到 r 数组的值就是原来 a 数组的值,而a数组因为在i=0的时候修改了数据所以最终输出的是改过之后的值。
那就有个问题了,怎么才能让r 和 a数组的值一样呢?对,你猜对了。就是遍历的时候把 a 改成 a 的地址。

func main() {
	var a = [5]int{1, 2, 3, 4, 5}
	var r [5]int

	for i, v := range &a {
		if i == 0 {
			a[1] = 12
			a[2] = 13
		}
		r[i] = v
	}
	fmt.Println("r = ", r)
	fmt.Println("a = ", a)
}

输出:

r =  [1 12 13 4 5]
a =  [1 12 13 4 5]

咱们还是来看一下吧:
同样两个数组,a赋值了,r是个空的。接着看后面for range 一个 a 数组的指针类型,也就是说,就算是副本指针指向的位置和a 指向的地址也是一样的,所以a也被修改了。
也就是说,只要牵扯到修改值的问题,你就传指针,也就不用考虑那么多了。
接下来咱们看一下这种:

func main() {
	var a = []int{1, 2, 3, 4, 5}
	var r [5]int
	for i, v := range a {
		if i == 0 {
			a[1] = 12
			a[2] = 13
		}
		r[i] = v
	}
	fmt.Println("r = ", r)
	fmt.Println("a = ", a)
}

分析:首先定义一个切片类型a,并进行赋值,之后创建一个空数组r长度为5,同样的遍历a,但是这块跟之前的不一样,之前a是个数组,现在a是个切片,所以遍历的时候是a切片的副本,但是切片类型在go语言中其实就是一个结构体,里面包含三部分:1.指向底层数组的一个指针 2.切片长度 3.切片容量。那既然有指针,那就不用说了吧,就算是副本,改了也就是改了。所以别想那么多,输出肯定是这样的:

r =  [1 12 13 4 5]
a =  [1 12 13 4 5]

验证一下,确实是,完美。

总结:
1.for range的时候需要看一下遍历对象是什么,只要有指针,在遍历的时候改了就是改了,原数据也会改,如果只是值,那就没办法了,改了也是白改。
2.切片slice的底层其实是一个指向底层数组的一个指针,再加一个长度、一个容量。

最后

以上就是发嗲故事为你收集整理的Go语言关于for range的案例分析的全部内容,希望文章能够帮你解决Go语言关于for range的案例分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部