go語言資料結構有四大類:1、基礎型別,包括整型(有符號和無符號整數)、浮點數、複數、字串(由不可變的位元組序列構成)、布林值(只有true和false兩個值);2、聚合型別,包括陣列、結構體(是由任意個任意型別的變數組合在一起的資料型別);3、參照型別,包括指標、slice(是一個擁有相同元素的可變長度序列)、map、function、channel;4、介面型別。
php入門到就業線上直播課:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API偵錯工具:
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
每一門語言都有自己的資料結構,Go 語言也不例外,總共有四大類,基礎型別、聚合型別、參照型別和介面型別。本文簡單介紹一下這些型別。
Go 的整型分為有符號和無符號整數。
有符號整數會分成 int8、int16、int32、int64
無符號整數會分成 uint8、uint16、uint32、uint64
但通常會直接使用 int 和 uint,因為這兩種型別會根據平臺的特性,自動轉成運算效率最高的型別,現在 32 位以下的計算機一級很少見了,所以 int 通常是 32 或者 64位元,但具體要根據平臺和編譯器決定。【相關推薦:Go視訊教學、】
int 是目前使用最廣泛的數值型別,在需要明確指定數值位數的時候,直接使用 int 就可以。
通常來說,有符號的整數就夠用,無符號整數只有在位運算或者特定算數的時候才會使用。
uintptr 和 rune 是兩類特殊的數位型別,uintptr 大小不明確,用來儲存指標,主要用於底層程式設計,比如用於 Go 語言與 C 語言的互動。
如果兩個值可以使用 == 和 != 進行比較,說明這個兩個值是可比較的。
整數是可比較的。
除了整型資料之外,Go 語言中,還有兩種資料型別:浮點數和複數。
浮點數有 float32 和 float64 兩種型別,浮點數一般使用指數表示法,使用 e 或者 E 來表示。
float32 的正數範圍是 1.4e-45 ~ 3.4e38
float64 的正數範圍是 4.9e-324 ~ 1.8e308
在 10 進位制下,float64 的有效數位是 15 位,遠遠超過了 float32 的 5 位,如果沒有特殊的情況,應該優先使用 float64。
複數也有兩種 complex64 和 complex128,這兩種型別分別由 float32 和 float64 構成。math/cmplx
庫提供了複數運算所需要的函數。
浮點數和複數都是可比較的。
字串可是說是最常用的資料型別。字串由不可變的位元組序列([]byte)構成,字串的內容通常會用 UTF-8 的編碼格式處理,這點在上一篇文章中已經詳細的說明過了。
Go 的字串內容是不可變的,對當前字串做的操作都會生成一個新的字串。Go 字串天然支援 UTF-8,而且習慣上也會優先使用這種編碼方式,亂碼的煩惱會少一些。
Go 語言也為字串提供了豐富的類庫:
bytes:用於操作位元組slice([]byte),如果需要對字串進行頻繁的修改, 使用 byte.Buffer 會高效
strings:用於搜尋、替換等等字元傳操作
strconv:主要用於字串和其他基本資料型別之間的轉換
unicode:用來判斷字元的特性,比如是否是數位、是否大寫等等
字串是可比較的。
布林值相對來說比較簡單,只有兩個值: true
和 false
。可以使用 ! 符號來進行取反運算,!true 就是 false。
也可以使用 && 和 || 來進行組合運算,在組合運算中,也會遵循短路行為,短路行為是指左邊如果能直接確定最後的結果,那麼後面的計算將不會進行,如下:
var i = 1
// i < 100 程式碼就不會被執行
if i > 0 || i < 100 {
fmt.Printf("result %+v", i)
}
登入後複製
布林值是可比較的。
聚合型別的值由記憶體中的一組變數構成。陣列和結構體都是聚合型別,陣列和結構體的長度都是固定的。陣列中的的元素型別必須都相同,而結構體中的元素可以不同。
陣列是一個長度固定,擁有0 個或多個(不超過陣列長度)相同資料型別的序列。陣列在宣告的時候必須指定長度,可以使用常數,但是不能使用變數。
實際上,我們很少在程式碼中直接使用陣列,陣列在絕大部分的時候都是做為 slice 的底層儲存,並不會直接使用。
陣列的可比較性取決於元素的可比較性,如果元素是可比較的,那麼陣列也是可比較的,反之亦然。
結構體是由任意個任意型別的變數組合在一起的資料型別,和其他語言中類的概念相似。
type Student struct {
Name string
age int
}
登入後複製
Go 語言是一個物件導向的語言,但卻又拋棄了 Java 中類和物件的概念,結構體是 Go 語言實現物件導向的基礎之一,還有一部分是介面,下面會聊到。
在 Go 的物件導向中,已經擯棄了繼承的概念,但在結構體中,通過結構體巢狀,也算是實現了部分繼承的功能。
結構體的可比較性也取決於其中變數的可比較性。
參照是另外一種資料型別,很多 Go 語言的高階功能都依賴參照。參照都間接指向變數或者狀態,通過參照來運算元據會讓該資料的全部參照都受影響。
指標是一種資料型別,指標的值是一個變數的地址。對於一個變數來說,可以有多個指標,通過其中任意一個指標來修改資料,通過其他指標也會獲取到最新修改的值。
i := 1
p1 := &i
p2 := &i
*p1 = 2
fmt.Println(*p2) // 2
登入後複製
指標是可比較的。
slice 是一個擁有相同元素的可變長度序列。 slice 看起來與陣列很像,但本質上不同。
slice 依賴陣列,沒有陣列,就沒有 slice。
一個 slice 有三個屬性,指標,長度和容量。其中指標指向陣列中的某個元素(不一定是第一個),這是 slice 可以存取的第一個元素。
長度是 slice 中元素的個數,不能超過容量,容量通常是指 slice 指標的位置,到底層陣列的最後一個元素的位置的長度。
slice 不可比較, 只能和 nil 比較。
map 是雜湊表的參照。
map 的使用很簡單,但是需要注意一點,map 的 key 必須是可比較的,如果 key 不可比較,那就無法通過 key 查詢到響應的 value,value 的型別是沒有限制的,可以是任意值。
map 不可比較,只能和 nil 比較。
function 就是函數,在寫 Go 的 helloworld 程式時,就會用到函數。 函數也是一種參照型別。
function 本身不可比,只能和 nil 比較,但是可以通過反射獲取函數指標進行比較。
Go 語言天然支援搞並行。而 channel 就是其中關鍵一環,goroutine 用來並行執行任務。而 channel 則用來連線不同的 goroutine。channel 也是屬於參照型別。
channel 是可比較的。
Go 語言中還有一個型別是介面型別。
介面是 Go 實現物件導向的關鍵。Go 的介面型別很特別,你不需要去顯示的實現一個介面,只要把介面中的方法實現,就預設實現了這個介面。
介面型別是可比較的。
Go 的資料型別設計簡潔,但擴充套件性很好,開發者可以根據自己的需要動態的擴充套件資料,不只是對於結構體這種聚合資料型別,即使對於基礎資料型別,也可以根據的需要進行擴充套件。另外 Go 自帶對 JSON、xml 以及 Protocol Buffer 的支援,不需要引入外部的庫,這就使得寫程式時會很輕量級,可以儘可能少的引入依賴包。
更多程式設計相關知識,請存取:!!
以上就是go語言有哪些資料結構的詳細內容,更多請關注TW511.COM其它相關文章!