【從零開始學習Go語言】八.Go語言的數組切片引用類型與值類型(總結)

【從零開始學習Go語言】Go語言的數組與切片引用類型與值類型


一.數組

go語言的數組在之前的一些例子中有引用過,go的數組在創建時需要聲明存儲數據的類型,長度,並且長度在確定後便不可增加,類似python中的元組

  • 數組的聲明方式有多種:
  • 第一種
package main

import (
	"fmt"
)

func main() {
	var array [10]int			//創建並初始化默認值爲0,長度爲10
	fmt.Println(array)			//這裏打印可以看到輸出的數組全部都是10
    
    array[0]=1					//[]中的是索引
    array[1]=2					
    array[2]=3
    //···
    fmt.Println(array)			//這裏輸出就發現內容的值已經被填充,當然還有更簡單的方法做這非常簡單的操作,這裏只是基礎的解釋
    
    
}

  • 第二種
package main

import (
	"fmt"
)

func main() {
	var arr = [3]int{123}			//使用var創建名稱爲arr的數組,arr的類型是什麼取決於=後面的表達式,使用此方法可直接初始化並賦值
	fmt.Println(arr)
}

  • 第三種
package main

import (
	"fmt"
)

func main() {
	arr := [5]int{1, 2, 3, 4, 5}	 //簡單方法聲明,不過注意這種聲明變量的方法只能用在方法內部
    								 //比如現在的arr是在main的內部,如在外部也就是和package平級
    								 //下需要使用var命名,瞭解js的應該更容易理解,與作用域相似
	fmt.Println(arr)
}
  • 第四種

有時數組傳入的參數可能不確定或經常需要修改,每次都需要修改長度可能感覺很麻煩,這時就可以使用下面的方法啦,注意這裏的修改不是添加,而是初始化的參數

package main

import (
	"fmt"
)

func main() {
	var arr = [...]int{123}			//這裏的三個...根據傳入的參數長度而確定數組的長度,從而不必每次都修改長度
	fmt.Println(arr)
}

二.多維數組

所謂多維數組或二維數組,其實就是一個數組中嵌套另一個數組,注意數組設置的長度不包括二維數組或多維數組的長度。結構大概如下:

代碼演示:

//二維數組
package main

import (
	"fmt"
)

func main() {
	arr := [2][3]int{		//2是包含兩個數組,3是每個數組長度爲3
		{1, 2, 4},
		{1, 2}}
	fmt.Println(arr)		[[1 2 4] [1 2 0]]
	fmt.Println(arr[0])		[1 2 4]//打印第一個數組,索引爲0
	fmt.Println(arr[0][2])	 4//取出索引爲0的數組並搜索其中索引爲2的數字:4
}

三.切片

數組的長度是固定且不課修改的,而切片的表達方式與數組基本一樣,但大小不做限制,類似python中的數組

package main

import (
	"fmt"
)

func main() {
	arr := []int{1, 2, 3, 4, 5, 6}
	fmt.Println(arr)
}

不填寫長度就是切片啦,不過這裏注意一點,切片的長度第一次初始化是根據所傳入參數長度確認,第二次是根據第一次傳入的參數長度爲基準,話有點繞,下面演示個例子

package main

import (
	"fmt"
)

func main() {
	arr := []int{1, 2, 3, 4, 5, 6}
	fmt.Println(cap(arr))		//6;cap查看的是切片的空間大小,也就是這個比如數組的長度設置了長度爲10,實際使用了3,len返回的是3,而cap是10
	arr = append(arr, 1, 2, 3)
	fmt.Println(cap(arr))		//12;當切片長度增加,go會根據這個切片的原始長度疊加,假如第二次添加的數據沒有達到12,它是不會再次疊加的
}


四.值類型與引用類型

  • 這裏用一個例子來介紹吧:
package main

import (
	"fmt"
)

func main() {
	//值類型
	fmt.Println("\n---------------值類型-------------------------")
	arr := [...]int{1, 2, 3, 4}

	a := arr
	fmt.Printf(" arr原值:%d,a原值:%d \n", arr, a)
	a[1] = 5
	fmt.Printf(" arr的值:%d \n arr的內存地址:%p \n a的值:%d \n a的內存地址:%p", arr, &arr, a, &a)
	//引用類型
	fmt.Println("\n---------------引用類型-------------------------")
	array := []int{1, 2, 3, 4}

	b := array
	fmt.Printf(" array原值:%d,b原值:%d \n", array, b)
	b[1] = 5
	fmt.Printf(" array的值:%d \n array的內存地址:%p \n b的值:%d \n b的內存地址:%p", array, &array, b, &b)

}

返回:

---------------值類型-------------------------
 arr原值:[1 2 3 4],a原值:[1 2 3 4] 
 arr的值:[1 2 3 4] 
 arr的內存地址:0xc00001c1c0 
 a的值:[1 5 3 4] 
 a的內存地址:0xc00001c1e0
---------------引用類型-------------------------
 array原值:[1 2 3 4],b原值:[1 2 3 4] 
 array的值:[1 5 3 4] 
 array的內存地址:0xc00000c080 
 b的值:[1 5 3 4] 
 b的內存地址:0xc00000c0a0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章