码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-12-25 22:15:06      阅读:651      评论:0      收藏:0      [点我收藏+]

标签:lan   出现   形参   目的   port   遍历数组   ...   类型   产生   

在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遍历数组尝试修改元素值的问题

标签:lan   出现   形参   目的   port   遍历数组   ...   类型   产生   

原文地址:https://www.cnblogs.com/-beyond/p/8110634.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!