go語言資料結構有四大類:1、基礎類型,包括整數(有符號和無符號整數)、浮點數、複數、字串(由不可變的位元組序列構成)、布林值(只有true和false兩個值);2、聚合類型,包括數組、結構體(是由任意個任意類型的變數組合在一起的資料型別);3、引用型,包括指標、slice(是一個擁有相同元素的可變長度序列)、map、function、channel;4、介面類型。
本教學操作環境: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語言有哪些資料結構的詳細內容。更多資訊請關注PHP中文網其他相關文章!