陣列
賦值和傳參是複製整個陣列而不是指標
陣列是固定長度的特定型別元素組成的序列。一個陣列由零或多個元素組成。陣列的長度是固定,因此Go更常用Slice(切片,動態增長或收縮序列)。陣列是值型別,用索引下標訪問每個元素,範圍是0~len(陣列)-1,訪問越界會panic異常
定義陣列
var 陣列名 [陣列大小]資料型別
var a1 [5]int
因為是int 型別,所以定義陣列後,5個元素都有預設值 0
陣列賦值方式
a[0]=1
a[1]=2
//宣告賦值方式
var a1 [5]string = [5]string{"大貓", "二狗"}
//自動型別推導,未賦值的有預設值
var a2 = [5]int{1, 2, 3}
//自動判斷陣列長度
var a3 = [...]int{1, 2, 3, 4, 5}
// fmt.Println(a3)
//[1 2 3 4 5]
//指定索引賦值元素
var a4 = [...]string{3: "狗蛋", 6: "貓屎"}
fmt.Println(a4)
// [ 狗蛋 貓屎]
//結構體型別陣列
var a5 = [...]struct {
name string
age int
}{
{"王麻子", 10},
{"呂秀才", 29},
}
fmt.Println(a5)
// [{王麻子 10} {呂秀才 29}]
陣列的第一個元素的地址,就是陣列的首地址
陣列各個元素地址間隔根據陣列的資料型別決定,int64 8位元組 int32 4位元組
案例
var intArr [5]int
fmt.Println("intArr預設值是:", intArr)
// intArr預設值是: [0 0 0 0 0]
intArr[0] = 1
intArr[1] = 2
intArr[2] = 3
fmt.Println("intArr賦值後的值是:", intArr)
//intArr賦值後的值是: [1 2 3 0 0]
fmt.Printf("intArr陣列地址是=%p\n", &intArr)
//intArr陣列地址是=0xc000108030
fmt.Printf("intArr陣列第一個元素地址是=%p\n", &intArr[0])
//intArr陣列第一個元素地址是=0xc000108030
fmt.Printf("intArr陣列第二個元素地址是=%p\n", &intArr[1])
//intArr陣列第二個元素地址是=0xc000108038
fmt.Printf("intArr陣列第三個元素地址是=%p\n", &intArr[2])
//intArr陣列第三個元素地址是=0xc000108040
陣列使用步驟
1. 宣告陣列
2. 給陣列元素賦值
3. 使用陣列
4. 陣列索引從0開始,且不得越界否則panic
5. Go陣列是值型別,變數傳遞預設是值傳遞,因此會進行值拷貝
6. 修改原本的陣列,可以使用引用傳遞(指標)
詳細介紹為啥需要 傳指標
因為傳陣列進去,會進行值拷貝,引數傳過去的資料,是之前資料的備份,如果想改老資料,需要傳的是老資料的指標,這個跟php 中的 &item 有點像
php程式碼
& 這個符號是取指標運算子,實際上是對指標操作,所以是對原資料的修改
function test(&$a){
$a=$a+100;
}
go
//函式修改原本陣列,需要使用引用傳遞
func test2(arr *[3]int) {
(*arr)[0] = 66 //可以縮寫arr[0]=66 編譯器自動識別,arr是指標型別
}
//test2修改了陣列
test2(&arr)
test函式不會修改陣列
test(arr)
本作品採用《CC 協議》,轉載必須註明作者和本文連結