首頁  >  文章  >  後端開發  >  go語言有哪些資料結構

go語言有哪些資料結構

青灯夜游
青灯夜游原創
2022-12-16 14:00:235962瀏覽

go語言資料結構有四大類:1、基礎類型,包括整數(有符號和無符號整數)、浮點數、複數、字串(由不可變的位元組序列構成)、布林值(只有true和false兩個值);2、聚合類型,包括數組、結構體(是由任意個任意類型的變數組合在一起的資料型別);3、引用型,包括指標、slice(是一個擁有相同元素的可變長度序列)、map、function、channel;4、介面類型。

go語言有哪些資料結構

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

每一門語言都有自己的資料結構,Go 語言也不例外,總共有四大類,基礎類型、聚合類型、參考類型和介面類型。本文簡單介紹一下這些類型。

go語言有哪些資料結構

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語言有哪些資料結構的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn