Go語言是一門強型別語言,其中的資料型別可以分為引用資料型別和值資料型別兩種。引用資料類型和值資料類型在使用上略有不同,以下我們來具體了解下這兩種資料類型。
一、引用資料型別
引用資料型別在Go語言中包含切片、映射、通道、介面和指標。對於引用資料類型,變數的值不僅僅是自身的值,而是指向記憶體位址的指標。因此,當我們聲明一個引用類型的變數時,會為其分配一塊記憶體位址,儲存在堆疊中,該記憶體位址指向的空間則儲存在堆中。
切片是一種動態數組,可以按需自動增長或縮小。以字串切片為例,宣告及初始化如下:
var s1 []string // 宣告切片
s1 = make([]string, 3) // 用make函數初始化切片
s2 := []string{"foo", "bar", "baz"} // 直接宣告切片並初始化
在Go語言中,切片是一個指向底層資料的指針,同時包含了切片的長度和容量,即len和cap函數傳回的值。當切片的元素數量超出容量時,Go語言會重新分配一塊更大的記憶體空間,然後再將原有元素複製到新的記憶體空間。
映射是一種無序的鍵值對集合,在Go語言中使用map關鍵字定義。以字串映射為例,宣告及初始化如下:
m1 := make(map[string]int) // 用make函數初始化映射
m2 := map[string]int{" foo": 1, "bar": 2, "baz": 3} // 直接宣告映射並初始化
在Go語言中,映射也是一個指向底層資料的指針,同時包含了映射元素的數量。當映射中的元素數量超出底層記憶體容量時,Go語言會重新分配一塊更大的記憶體空間。
通道是一種在多個攜程之間傳遞資料的方式,在Go語言中使用make函數和<-操作符宣告一個通道。以一個字串通道為例,宣告及初始化如下:
var ch1 chan string // 宣告頻道
ch1 = make(chan string) // 用make函數初始化頻道
ch2 := make(chan string, 3) // 用make函數初始化帶緩衝的通道
ch1 <- "foo" // 向通道發送資料
data := <-ch1 // 從通道中讀取資料
在Go語言中,通道也是指向底層資料的指針,同時包含了通道的容量和目前元素數量。當通道中的元素數量超出容量時,Go語言會將目前的攜程阻塞,等待其他攜程取走元素。
介面是一種資料型,定義了一組介面方法的集合。以一個簡單介面為例,宣告如下:
type Caller interface {
Call() bool
}
在Go語言中,介面也是一個指向底層資料的指標,指向當實現該介面的結構體。由於介面方法不會被實作操作複製,因此介面比值類型更快。
指標是一個包含了記憶體位址的變量,在Go語言中使用&和*操作符來宣告和使用指標。以一個指向字串類型變數的指標為例,宣告及使用如下:
var p1 *string // 宣告指標
s1 := "foo"
p1 = &s1 // 將指標指向字串變數的記憶體位址
fmt.Println("s1:", s1, "p1:", *p1) // 透過指標取得字串變數的值
在Go語言中,指標指向的變數需要事先聲明,Go語言中沒有類似C語言中的指標運算子。
二、值資料型別
值資料型別在Go語言中包含布林型、整數、浮點型、複數型、字元型、字串和陣列。對於值類型的變量,變數的值與變數本身儲存在堆疊中。
布林型在Go語言中只有兩個值:true和false。由於布林型只有一個字節,因此在大量使用的情況下,可以有效減少記憶體佔用量。
Go語言的整數分為有符號整數和無符號整數,有符號整數分為int8,int16,int32和int64 ,無符號整數分為uint8,uint16,uint32和uint64。在使用時,建議盡可能使用int和uint類型,因為這兩種類型在不同平台上的位元組寬度是相同的。
Go語言的浮點型分為float32和float64兩種型,預設為float64型別。在使用時,建議盡可能使用float64類型,因為該類型的計算速度和準確性都比float32類型高。
複數型在Go語言中使用complex64和complex128兩種型別來表示實數和虛數。例如,complex64類型表示實部和虛部都是float32類型的複數。
字元類型在Go語言中使用rune來表示,rune型別和int32型別標識的範圍相同。在Go語言中,可以使用單引號來表示字元。
字串在Go語言中是一個唯讀的字元序列,在Go語言中使用雙引號來表示字串。 Go語言中的字串是UTF-8編碼的。
陣列在Go語言中是固定長度且元素類型相同的資料型別。使用時需要事先聲明數組的長度和元素類型。
結論
引用資料型別和值資料型別在Go語言中使用上略有不同,透過對比可以發現,值資料型別儲存在堆疊中,變數在記憶體中的位置不隨時間而變化(如果不使用指針操作),而引用資料類型變數的值是一個指針,指向在堆中分配的記憶體位址。在實際使用中,應該合理運用引用資料型別和值資料型別,以達到最優的效能和效果。
以上是Go語言中的引用資料型別與值資料型別的詳細內容。更多資訊請關注PHP中文網其他相關文章!