Array陣列

laosan123發表於2021-10-22

陣列

賦值和傳參是複製整個陣列而不是指標

陣列是固定長度的特定型別元素組成的序列。一個陣列由零或多個元素組成。陣列的長度是固定,因此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 協議》,轉載必須註明作者和本文連結

相關文章