任何一門語言都有對應(yīng)的基礎(chǔ)類型,這些基礎(chǔ)類型和現(xiàn)實(shí)中的事物一一對應(yīng)。Go語言也不例外,Go語言數(shù)據(jù)類型包含基礎(chǔ)類型和復(fù)合類型兩大類。
基礎(chǔ)數(shù)據(jù)類型包括:布爾型、整型、浮點(diǎn)型、復(fù)數(shù)型、字節(jié)型(byte)、字符串型、Unicode(rune類型,代表一個(gè)utf-8字符)。
Go語言的字符有以下兩種:
uint8 類型,或者叫byte型,代表了一個(gè)ASCII的字符
rune 類型,代表一個(gè)UTF-8字符。當(dāng)需要處理中文、日文或者其他復(fù)合字符時(shí),需要用到rune類型。rune類型實(shí)際是一個(gè)int32。
Go使用了特殊的rune類型來處理Unicode,讓基于Unicode的文本處理更為方便,也可以使用byte型進(jìn)行默認(rèn)字符串處理,性能和擴(kuò)展性都有照顧。
復(fù)合數(shù)據(jù)類型包括:指針、數(shù)組、切片、字典、通道、結(jié)構(gòu)體、接口。
【整型】
在Go語言中,整型分為:
有符號(hào)整型:如int、int8、int16、int32和int64
無符號(hào)整型:uint、uint8、uint16、uint32和uint64
它們的差別在于,有符號(hào)整型表示的是數(shù)值可以為負(fù)數(shù)、零和正數(shù),而無符號(hào)整型只能是零和正數(shù)。在整型中,如果能確定int的bit就選擇比較明確的int類型,因?yàn)檫@樣會(huì)讓程序具備很好地移植性。
在Go語言中,還有一種字節(jié)類型byte,它等價(jià)于uint8類型,可以理解為uint8類型的別名,用于定義一個(gè)字節(jié),所以字節(jié)byte類型屬于整型。
【浮點(diǎn)數(shù)】
浮點(diǎn)數(shù)就是代表現(xiàn)實(shí)中的小數(shù)。Go語言提供了兩種精度的浮點(diǎn)數(shù),分別是float32 和float64。項(xiàng)目中最常用的是float64,因?yàn)樗木雀?,浮點(diǎn)計(jì)算的結(jié)果相比float32誤差更小。
【布爾型】
一個(gè)布爾型的值只有兩種:true和false,它們代表的現(xiàn)實(shí)中的“是”或“否”。它們的值經(jīng)常被用于一些判斷中。Go語言中的布爾型使用關(guān)鍵字bool定義。
【字符串】
Go語言中的字符串可以表示任意數(shù)據(jù),Go語言中,字符串通過類型string聲明??梢酝ㄟ^操作符 + 把字符串拼接起來。也可以通過+=運(yùn)算符操作。
【零值】
零值其實(shí)就是一個(gè)變量的默認(rèn)值,在Go語言中,如果我們聲明了一個(gè)變量,但是沒有對其初始化,那么Go語言會(huì)自動(dòng)初始化其值為對應(yīng)類型的零值。比如數(shù)字類的零值是0,布爾型的零值是false,字符串的零值是""空字符串。
變量聲明
變量代表可變的數(shù)據(jù)類型,即在程序執(zhí)行過程中可能會(huì)被一次甚至多次修改。
在Go語言中,通過var關(guān)鍵字聲明語句來定義一個(gè)變量,定義的時(shí)候需要制定這個(gè)變量的類型,然后在為它取個(gè)名字,并且設(shè)置好變量的初始值。var聲明一個(gè)變量的格式如下:
var 變量名 類型 = 表達(dá)式

Go語言中定義的變量必須使用,否則無法編譯通過,這也是Go語言比較好的特性, 防止定義了變量不使用,導(dǎo)致浪費(fèi)內(nèi)存的情況。
Go語言具有類型推到功能,所以可以不用刻意的指定變量的類型,而是讓Go語言自己推導(dǎo),比如變量i的聲明如下:
var i = 10

此時(shí)變量i的類型默認(rèn)是int類型。也可以一次聲明多個(gè)變量,把要聲明的變量放到一個(gè)括號(hào)中即可,如下所示:
var(
j int = 1
k int = 2
)
// 因?yàn)轭愋屯茖?dǎo),上面的多變量聲明可以簡寫為如下方式
var (
j = 1
k = 2
)

不止int類型,后面介紹的float64、bool、string 等基礎(chǔ)類型都可以被自動(dòng)推導(dǎo),即可以省略定義類型。
變量簡短聲明
使用var關(guān)鍵字聲明變量,代碼很繁瑣,借助類型推導(dǎo),Go語言提供了變量的簡短聲明** :=**, 結(jié)構(gòu)如下:
變量名 := 表達(dá)式
i := 10
bf := false
s1 := "hello"

實(shí)際項(xiàng)目實(shí)戰(zhàn)中,如果能為聲明的變量初始化,那就選擇簡短聲明方式,這種方式是使用最多的。
指針
在Go語言中,指針對應(yīng)的是變量在內(nèi)存中的存儲(chǔ)位置,也就是說指針的值就是變量的內(nèi)存地址。通過&可以獲取一個(gè)變量的地址,也就是指針。想要獲得指針指向的變量的值,通過***** 表達(dá)式即可。
p1 := &i
fmt.Println(*p1)

賦值
最簡單的賦值語句就是=。
常量
一門編程語言,有變量就有常量,Go語言也不例外。在程序中,常量的值是指在編譯期就確定好的,一旦確定好之后就不能再修改,這樣就可以防止在運(yùn)行期被惡意篡改。
常量的定義
常量的定義和變量類似,通過關(guān)鍵字const,因?yàn)镚o語言可以類型推導(dǎo),所以在常量聲明是可以忽略類型。在Go語言中,只允許布爾型、字符串、數(shù)字類型這些基礎(chǔ)類型作為常量。
iota
iota是一個(gè)常量生成器,它可以用來初始化相似規(guī)則的常量,避免重復(fù)的初始化。iota的初始值是0,它的能力是在每一個(gè)有常量聲明的行后面+1。
const (
one = iota + 1
two
three
four
)

字符串和類型轉(zhuǎn)換
字符串是Go語言中常用的類型。
Go語言是強(qiáng)類型的語言,也就是說不同類型的變量是無法相互使用和計(jì)算的,也是為了保證Go程序的健壯性,所以不同類型的變量在進(jìn)行賦值或計(jì)算前,需要先進(jìn)行類型轉(zhuǎn)換。
i2s := strconv.Itoa(i) // alphabet 字母
s2i, err := strconv.Atoi(i)
fmt.Println(i2s, s2i, err)

通過strconv包Itoa函數(shù)可以把一個(gè)int類型轉(zhuǎn)換為string,Atoi函數(shù)可以把string轉(zhuǎn)換為int。同理,對于浮點(diǎn)數(shù)、布爾型,Go語言提供了strconv.ParseFloat、strconv.ParseBool、strconv.FormatFloat和strconv.FormatBool進(jìn)行轉(zhuǎn)換。
對于數(shù)字類型之間,可以通過強(qiáng)制轉(zhuǎn)換的方式。采用強(qiáng)制轉(zhuǎn)換的方式轉(zhuǎn)換數(shù)字類型,可能會(huì)丟失一些精度,比如浮點(diǎn)數(shù)轉(zhuǎn)整型時(shí),小數(shù)點(diǎn)部分會(huì)全部丟棄。
把變量轉(zhuǎn)換為對應(yīng)的類型后,就可以對相同類型的變量進(jìn)行各種表達(dá)式運(yùn)算和賦值了。
Strings 包
講到基礎(chǔ)類型,尤其是字符串,不得不提Go SDK為我們提供的一個(gè)標(biāo)準(zhǔn)包Strings。它是用于處理字符串的工具包,里面有很多常用的函數(shù),幫助我們對字符串進(jìn)行操作。比如查找字符串、去除字符串的空格、拆分字符串、判斷字符串是否有某個(gè)前綴或者后綴等。掌握好它,有利于我們高效編程。