這篇文章主要介紹“go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)分為哪幾類(lèi)”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)分為哪幾類(lèi)”文章能幫助大家解決問(wèn)題。
目前創(chuàng)新互聯(lián)已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、贛榆網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)有四大類(lèi):1、基礎(chǔ)類(lèi)型,包括整型(有符號(hào)和無(wú)符號(hào)整數(shù))、浮點(diǎn)數(shù)、復(fù)數(shù)、字符串(由不可變的字節(jié)序列構(gòu)成)、布爾值(只有true和false兩個(gè)值);2、聚合類(lèi)型,包括數(shù)組、結(jié)構(gòu)體(是由任意個(gè)任意類(lèi)型的變量組合在一起的數(shù)據(jù)類(lèi)型);3、引用類(lèi)型,包括指針、slice(是一個(gè)擁有相同元素的可變長(zhǎng)度序列)、map、function、channel;4、接口類(lèi)型。
每一門(mén)語(yǔ)言都有自己的數(shù)據(jù)結(jié)構(gòu),Go 語(yǔ)言也不例外,總共有四大類(lèi),基礎(chǔ)類(lèi)型、聚合類(lèi)型、引用類(lèi)型和接口類(lèi)型。
Go 的整型分為有符號(hào)和無(wú)符號(hào)整數(shù)。
有符號(hào)整數(shù)會(huì)分成 int8、int16、int32、int64
無(wú)符號(hào)整數(shù)會(huì)分成 uint8、uint16、uint32、uint64
但通常會(huì)直接使用 int 和 uint,因?yàn)檫@兩種類(lèi)型會(huì)根據(jù)平臺(tái)的特性,自動(dòng)轉(zhuǎn)成運(yùn)算效率最高的類(lèi)型,現(xiàn)在 32 位以下的計(jì)算機(jī)一級(jí)很少見(jiàn)了,所以 int 通常是 32 或者 64位,但具體要根據(jù)平臺(tái)和編譯器決定。
int 是目前使用最廣泛的數(shù)值類(lèi)型,在需要明確指定數(shù)值位數(shù)的時(shí)候,直接使用 int 就可以。
通常來(lái)說(shuō),有符號(hào)的整數(shù)就夠用,無(wú)符號(hào)整數(shù)只有在位運(yùn)算或者特定算數(shù)的時(shí)候才會(huì)使用。
uintptr 和 rune 是兩類(lèi)特殊的數(shù)字類(lèi)型,uintptr 大小不明確,用來(lái)存儲(chǔ)指針,主要用于底層編程,比如用于 Go 語(yǔ)言與 C 語(yǔ)言的交互。
如果兩個(gè)值可以使用 == 和 != 進(jìn)行比較,說(shuō)明這個(gè)兩個(gè)值是可比較的。
整數(shù)是可比較的。
除了整型數(shù)據(jù)之外,Go 語(yǔ)言中,還有兩種數(shù)據(jù)類(lèi)型:浮點(diǎn)數(shù)和復(fù)數(shù)。
浮點(diǎn)數(shù)有 float32 和 float64 兩種類(lèi)型,浮點(diǎn)數(shù)一般使用指數(shù)表示法,使用 e 或者 E 來(lái)表示。
float32 的正數(shù)范圍是 1.4e-45 ~ 3.4e38
float64 的正數(shù)范圍是 4.9e-324 ~ 1.8e308
在 10 進(jìn)制下,float64 的有效數(shù)字是 15 位,遠(yuǎn)遠(yuǎn)超過(guò)了 float32 的 5 位,如果沒(méi)有特殊的情況,應(yīng)該優(yōu)先使用 float64。
復(fù)數(shù)也有兩種 complex64 和 complex128,這兩種類(lèi)型分別由 float32 和 float64 構(gòu)成。math/cmplx
庫(kù)提供了復(fù)數(shù)運(yùn)算所需要的函數(shù)。
浮點(diǎn)數(shù)和復(fù)數(shù)都是可比較的。
字符串可是說(shuō)是最常用的數(shù)據(jù)類(lèi)型。字符串由不可變的字節(jié)序列([]byte)構(gòu)成,字符串的內(nèi)容通常會(huì)用 UTF-8 的編碼格式處理,這點(diǎn)在上一篇文章中已經(jīng)詳細(xì)的說(shuō)明過(guò)了。
Go 的字符串內(nèi)容是不可變的,對(duì)當(dāng)前字符串做的操作都會(huì)生成一個(gè)新的字符串。Go 字符串天然支持 UTF-8,而且習(xí)慣上也會(huì)優(yōu)先使用這種編碼方式,亂碼的煩惱會(huì)少一些。
Go 語(yǔ)言也為字符串提供了豐富的類(lèi)庫(kù):
bytes:用于操作字節(jié)slice([]byte),如果需要對(duì)字符串進(jìn)行頻繁的修改, 使用 byte.Buffer 會(huì)高效
strings:用于搜索、替換等等字符傳操作
strconv:主要用于字符串和其他基本數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換
unicode:用來(lái)判斷字符的特性,比如是否是數(shù)字、是否大寫(xiě)等等
字符串是可比較的。
布爾值相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,只有兩個(gè)值: true
和 false
??梢允褂?! 符號(hào)來(lái)進(jìn)行取反運(yùn)算,!true 就是 false。
也可以使用 && 和 || 來(lái)進(jìn)行組合運(yùn)算,在組合運(yùn)算中,也會(huì)遵循短路行為,短路行為是指左邊如果能直接確定最后的結(jié)果,那么后面的計(jì)算將不會(huì)進(jìn)行,如下:
var i = 1
// i < 100 代碼就不會(huì)被執(zhí)行
if i > 0 || i < 100 {
fmt.Printf("result %+v", i)
}
布爾值是可比較的。
聚合類(lèi)型的值由內(nèi)存中的一組變量構(gòu)成。數(shù)組和結(jié)構(gòu)體都是聚合類(lèi)型,數(shù)組和結(jié)構(gòu)體的長(zhǎng)度都是固定的。數(shù)組中的的元素類(lèi)型必須都相同,而結(jié)構(gòu)體中的元素可以不同。
數(shù)組是一個(gè)長(zhǎng)度固定,擁有0 個(gè)或多個(gè)(不超過(guò)數(shù)組長(zhǎng)度)相同數(shù)據(jù)類(lèi)型的序列。數(shù)組在聲明的時(shí)候必須指定長(zhǎng)度,可以使用常量,但是不能使用變量。
實(shí)際上,我們很少在代碼中直接使用數(shù)組,數(shù)組在絕大部分的時(shí)候都是做為 slice 的底層存儲(chǔ),并不會(huì)直接使用。
數(shù)組的可比較性取決于元素的可比較性,如果元素是可比較的,那么數(shù)組也是可比較的,反之亦然。
結(jié)構(gòu)體是由任意個(gè)任意類(lèi)型的變量組合在一起的數(shù)據(jù)類(lèi)型,和其他語(yǔ)言中類(lèi)的概念相似。
type Student struct {
Name string
age int
}
Go 語(yǔ)言是一個(gè)面向?qū)ο蟮恼Z(yǔ)言,但卻又拋棄了 Java 中類(lèi)和對(duì)象的概念,結(jié)構(gòu)體是 Go 語(yǔ)言實(shí)現(xiàn)面向?qū)ο蟮幕A(chǔ)之一,還有一部分是接口,下面會(huì)聊到。
在 Go 的面向?qū)ο笾?,已?jīng)擯棄了繼承的概念,但在結(jié)構(gòu)體中,通過(guò)結(jié)構(gòu)體嵌套,也算是實(shí)現(xiàn)了部分繼承的功能。
結(jié)構(gòu)體的可比較性也取決于其中變量的可比較性。
引用是另外一種數(shù)據(jù)類(lèi)型,很多 Go 語(yǔ)言的高級(jí)功能都依賴(lài)引用。引用都間接指向變量或者狀態(tài),通過(guò)引用來(lái)操作數(shù)據(jù)會(huì)讓該數(shù)據(jù)的全部引用都受影響。
指針是一種數(shù)據(jù)類(lèi)型,指針的值是一個(gè)變量的地址。對(duì)于一個(gè)變量來(lái)說(shuō),可以有多個(gè)指針,通過(guò)其中任意一個(gè)指針來(lái)修改數(shù)據(jù),通過(guò)其他指針也會(huì)獲取到最新修改的值。
i := 1
p1 := &i
p2 := &i
*p1 = 2
fmt.Println(*p2) // 2
指針是可比較的。
slice 是一個(gè)擁有相同元素的可變長(zhǎng)度序列。 slice 看起來(lái)與數(shù)組很像,但本質(zhì)上不同。
slice 依賴(lài)數(shù)組,沒(méi)有數(shù)組,就沒(méi)有 slice。
一個(gè) slice 有三個(gè)屬性,指針,長(zhǎng)度和容量。其中指針指向數(shù)組中的某個(gè)元素(不一定是第一個(gè)),這是 slice 可以訪問(wèn)的第一個(gè)元素。
長(zhǎng)度是 slice 中元素的個(gè)數(shù),不能超過(guò)容量,容量通常是指 slice 指針的位置,到底層數(shù)組的最后一個(gè)元素的位置的長(zhǎng)度。
slice 不可比較, 只能和 nil 比較。
map 是散列表的引用。
map 的使用很簡(jiǎn)單,但是需要注意一點(diǎn),map 的 key 必須是可比較的,如果 key 不可比較,那就無(wú)法通過(guò) key 查詢到響應(yīng)的 value,value 的類(lèi)型是沒(méi)有限制的,可以是任意值。
map 不可比較,只能和 nil 比較。
function 就是函數(shù),在寫(xiě) Go 的 helloworld 程序時(shí),就會(huì)用到函數(shù)。 函數(shù)也是一種引用類(lèi)型。
function 本身不可比,只能和 nil 比較,但是可以通過(guò)反射獲取函數(shù)指針進(jìn)行比較。
Go 語(yǔ)言天然支持搞并發(fā)。而 channel 就是其中關(guān)鍵一環(huán),goroutine 用來(lái)并發(fā)執(zhí)行任務(wù)。而 channel 則用來(lái)連接不同的 goroutine。channel 也是屬于引用類(lèi)型。
channel 是可比較的。
Go 語(yǔ)言中還有一個(gè)類(lèi)型是接口類(lèi)型。
接口是 Go 實(shí)現(xiàn)面向?qū)ο蟮年P(guān)鍵。Go 的接口類(lèi)型很特別,你不需要去顯示的實(shí)現(xiàn)一個(gè)接口,只要把接口中的方法實(shí)現(xiàn),就默認(rèn)實(shí)現(xiàn)了這個(gè)接口。
接口類(lèi)型是可比較的。
關(guān)于“go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)分為哪幾類(lèi)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。