go語言有哪些資料結構

2022-12-16 18:01:15

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 語言也不例外,總共有四大類,基礎型別、聚合型別、參照型別和介面型別。本文簡單介紹一下這些型別。

1.png

1. 基礎型別

整型

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:用來判斷字元的特性,比如是否是數位、是否大寫等等

字串是可比較的。

布林值

布林值相對來說比較簡單,只有兩個值: truefalse。可以使用 ! 符號來進行取反運算,!true 就是 false。

也可以使用 && 和 || 來進行組合運算,在組合運算中,也會遵循短路行為,短路行為是指左邊如果能直接確定最後的結果,那麼後面的計算將不會進行,如下:

var i = 1
// i < 100 程式碼就不會被執行
if i > 0 || i < 100 {
    fmt.Printf("result %+v", i)
}
登入後複製

布林值是可比較的。

2. 聚合型別

聚合型別的值由記憶體中的一組變數構成。陣列和結構體都是聚合型別,陣列和結構體的長度都是固定的。陣列中的的元素型別必須相同,而結構體中的元素可以不同

陣列

陣列是一個長度固定,擁有0 個或多個(不超過陣列長度)相同資料型別的序列。陣列在宣告的時候必須指定長度,可以使用常數,但是不能使用變數。

實際上,我們很少在程式碼中直接使用陣列,陣列在絕大部分的時候都是做為 slice 的底層儲存,並不會直接使用。

陣列的可比較性取決於元素的可比較性,如果元素是可比較的,那麼陣列也是可比較的,反之亦然。

結構體

結構體是由任意個任意型別的變數組合在一起的資料型別,和其他語言中的概念相似。

type Student struct {
    Name string
    age  int
}
登入後複製

Go 語言是一個物件導向的語言,但卻又拋棄了 Java 中類和物件的概念,結構體是 Go 語言實現物件導向的基礎之一,還有一部分是介面,下面會聊到。

在 Go 的物件導向中,已經擯棄了繼承的概念,但在結構體中,通過結構體巢狀,也算是實現了部分繼承的功能。

結構體的可比較性也取決於其中變數的可比較性。

3. 參照型別

參照是另外一種資料型別,很多 Go 語言的高階功能都依賴參照。參照都間接指向變數或者狀態,通過參照來運算元據會讓該資料的全部參照都受影響。

指標

指標是一種資料型別,指標的值是一個變數的地址。對於一個變數來說,可以有多個指標,通過其中任意一個指標來修改資料,通過其他指標也會獲取到最新修改的值。

i := 1
p1 := &i
p2 := &i

*p1 = 2

fmt.Println(*p2) // 2
登入後複製

指標是可比較的。

slice

slice 是一個擁有相同元素的可變長度序列。 slice 看起來與陣列很像,但本質上不同。

slice 依賴陣列,沒有陣列,就沒有 slice。

一個 slice 有三個屬性,指標,長度和容量。其中指標指向陣列中的某個元素(不一定是第一個),這是 slice 可以存取的第一個元素。

長度是 slice 中元素的個數,不能超過容量,容量通常是指 slice 指標的位置,到底層陣列的最後一個元素的位置的長度。

slice 不可比較, 只能和 nil 比較。

map

map 是雜湊表的參照。

map 的使用很簡單,但是需要注意一點,map 的 key 必須是可比較的,如果 key 不可比較,那就無法通過 key 查詢到響應的 value,value 的型別是沒有限制的,可以是任意值。

map 不可比較,只能和 nil 比較。

function

function 就是函數,在寫 Go 的 helloworld 程式時,就會用到函數。 函數也是一種參照型別。

function 本身不可比,只能和 nil 比較,但是可以通過反射獲取函數指標進行比較。

channel

Go 語言天然支援搞並行。而 channel 就是其中關鍵一環,goroutine 用來並行執行任務。而 channel 則用來連線不同的 goroutine。channel 也是屬於參照型別。

channel 是可比較的。

4. 介面型別

Go 語言中還有一個型別是介面型別。

介面是 Go 實現物件導向的關鍵。Go 的介面型別很特別,你不需要去顯示的實現一個介面,只要把介面中的方法實現,就預設實現了這個介面。

介面型別是可比較的。

5. 小結

Go 的資料型別設計簡潔,但擴充套件性很好,開發者可以根據自己的需要動態的擴充套件資料,不只是對於結構體這種聚合資料型別,即使對於基礎資料型別,也可以根據的需要進行擴充套件。另外 Go 自帶對 JSON、xml 以及 Protocol Buffer 的支援,不需要引入外部的庫,這就使得寫程式時會很輕量級,可以儘可能少的引入依賴包。

更多程式設計相關知識,請存取:!!

以上就是go語言有哪些資料結構的詳細內容,更多請關注TW511.COM其它相關文章!