1. 程式人生 > >for循環使用range遍歷數組嘗試修改元素值的問題

for循環使用range遍歷數組嘗試修改元素值的問題

() 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遍歷數組嘗試修改元素值的問題