for循环使用range遍历数组尝试修改元素值的问题

Posted 寻觅beyond

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了for循环使用range遍历数组尝试修改元素值的问题相关的知识,希望对你有一定的参考价值。

在Golang语言中,将一个数组名作为参数传给一个函数,背后的操作是产生一个该数组的副本,在函数中对这个数组副本做的操作都不会影响原数组本身。比如下面这个例子

 

package main

import "fmt"

func main() {
	arr := [5]int{1, 2, 3, 4, 5}
	fmt.Println(arr) //1 2 3 4 5

	Do(arr) //尝试将arr清零

	fmt.Println(arr) //1 2 3 4 5
}

func Do(arr [5]int) {
	for i, _ := range arr {
		arr[i] = 0
	}
}

  可以看到,在尝试对数组元素进行改变操作之后,原数组的值并没有改变。

  要想达到目的,很自然的想到了数组指针,在main函数中,将数组的首地址作为参数传给函数,函数接收一个指针,然后用for循环对数组进行操作,最终,的确是达到了修改数组元素的目的。

package main

import "fmt"

func main() {
	arr := [5]int{1, 2, 3, 4, 5}
	fmt.Println(arr) //1 2 3 4 5

	Do(&arr) //尝试将arr清零

	fmt.Println(arr) //0 0 0 0 0
}

func Do(arr *[5]int) {
	for i, _ := range arr {
		arr[i] = 0
	}
}

  但是呢,这个代码看着特别别扭,为啥呢,因为函数Do的数组长度是事先指定的(上例中为5),并且想要函数正常运行,实现指定的长度还得与实参的数组长度相同,不然就会出现“类型出错”,这个就很麻烦了,因为这是Go语言中的语法规定,必须要遵守。

  自己私下一顿尝试:

  1==》在定义函数的时候,将形参的数组长度省略或者使用“...”

  2==》在main函数中,定义数组的时候,数组长度省略或使用“...”

  3==》两处都进行省略或者使用"..."

  无一例外,上面的尝试都失败了,到了这个时候,使用数组指针的方法已经行不通了,但是可以使用slice来实现。

以上是关于for循环使用range遍历数组尝试修改元素值的问题的主要内容,如果未能解决你的问题,请参考以下文章

java使用foreach语句遍历二维数组如何实现?

python中修改列表元素的方法

go语言基础语法-容器数据类型-数组

go语言基础语法-容器数据类型-数组

4/26打卡,范围for循环

Go 语言设计:for 和 range 是如何实现的