go語言學習總結之數組和切片

數組

1、數組在初始化的時候,需要指定大小,若不指定則會進行自動推算,而且數組大小是不可變的。
2、數組在作爲函數的入參時,需要明確指定數組大小,並且傳遞方式是值傳遞。
示例:

//數組聲明和初始化
a := [...]int{1,2,3}; //這裏需要注意,如果這樣聲明:a := []int{1,2,3};則a爲切片不是數組
b := [5]int{1,2,3,4,5};

//作爲函數函數傳入
func arrayCase(array [5]int){
	array[0]=100;
	array[1]=100;
	array[2]=100;
	array[3]=100;
	array[4]=100;
	fmt.Println("in func arrayCase:",array);
}
func main(){
	array := [5]int{1,2,3,4,5};
	fmt.Println("before invoke arrayCase:",array);
	arrayCase(array);
	fmt.Println("after invoke arrayCase:",array);
}
//輸出結果如下:
before invoke arrayCase: [1 2 3 4 5]
in func arrayCase: [100 100 100 100 100]
after invoke arrayCase: [1 2 3 4 5]

根據輸出結果可知,數組在作爲函數入參傳入的時候,需要明確指定數組的大小,且是值傳遞的方式,也就是說傳遞的是對原數組的拷貝,不影響原數組的值。

切片

1、切片在初始化的時候,無需指定大小,並且切片的大小是可變的。
2、切片在作爲函數的入參時,需要明確指定數組大小,並且傳遞方式是地址傳遞。
示例:

//切片聲明和初始化
c := []int{1,2,3};  //注意和數組的區別
d := make([]int,5);    //初始值都爲0
e := make([]int, 5, 10);  //初始值都爲0,聲明長度和容量
//添加元素增加切片的長度,要減少切片元素除了重新聲明再賦值之外,還有其他更好的辦法嗎,要是有的話請各位大佬指點一下
e = append(e , 38);  

//作爲函數函數傳入
func sliceCase(slice []int){
	slice[0]=99;
	slice[1]=99;
	slice[2]=99;
	slice[3]=99;
	slice[4]=99;
	fmt.Println("in func sliceCase",slice);
}
func main(){
	slice := make([]int, 5);
	fmt.Println("before invoke sliceCase:",slice);
	sliceCase(slice);
	fmt.Println("after invoke sliceCase:",slice);
}
//輸出結果如下:
before invoke sliceCase: [0 0 0 0 0]
in func sliceCase [99 99 99 99 99]
after invoke sliceCase: [99 99 99 99 99]

根據輸出結果可知,切片在作爲函數入參傳入的時候,無需制定切片大小,且是地址傳遞的方式,也就是說傳遞的是原切片的地址拷貝,在被調函數中對切片的操作都會根據地址間接尋址到原切片,從而影響原切片的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章