掌握Go語言的基本數(shù)據(jù)類型:編程世界的ABC
Go語言,以其簡潔的語法和強(qiáng)大的性能,已經(jīng)成為現(xiàn)代軟件開發(fā)領(lǐng)域中的重要力量。在Go語言的豐富特性中,基本數(shù)據(jù)類型扮演著至關(guān)重要的角色。它們是構(gòu)建復(fù)雜程序的基礎(chǔ),是每一個Go程序的起點。正如學(xué)習(xí)任何新語言一樣,了解其字母表(ABC)是掌握語言的關(guān)鍵第一步。在Go語言中,這意味著要熟悉其提供的基本數(shù)據(jù)類型。
Go語言提供的基本數(shù)據(jù)類型
Go語言的基本數(shù)據(jù)類型可以分為以下幾個類別:
- 整型:包括不同大小和符號的整數(shù),如 int, int8, int16, int32, int64 和 uint 等。
- 浮點型:用于表示實數(shù),包括 float32 和 float64。
- 布爾型:表示邏輯值 true 或 false。
- 字符串:用于表示文本數(shù)據(jù),是一個不可變的字符序列。
- rune 類型:代表一個 Unicode 碼點,等同于 int32。
- byte 類型:是 uint8 的別名,常用于表示字節(jié)。
int
定義int類型
var int1 = 1
fmt.Printf("int1類型:%T\n", int1)
輸出結(jié)果:
int1類型:int
注意:%T 查看變量的類型
進(jìn)制轉(zhuǎn)化
var i1 = 101
fmt.Printf("%d\n", i1) //轉(zhuǎn)成十進(jìn)制
fmt.Printf("%b\n", i1) //把十進(jìn)制轉(zhuǎn)成二級制
fmt.Printf("%o\n", i1) //把十進(jìn)制轉(zhuǎn)成八進(jìn)制
fmt.Printf("%x\n", i1) //把十進(jìn)制轉(zhuǎn)成十六進(jìn)制
fmt.Println("-----")
輸出結(jié)果:
數(shù)值為:101
把十進(jìn)制轉(zhuǎn)成二級制:1100101
把十進(jìn)制轉(zhuǎn)成八進(jìn)制:145
把十進(jìn)制轉(zhuǎn)成十六進(jìn)制:65
定義八進(jìn)制
八進(jìn)制一定是以0開頭的,逢八進(jìn)一位
i2 := 077
fmt.Printf("i2十進(jìn)制:%d\n", i2)
fmt.Printf("i2八進(jìn)制:%o\n", i2)
fmt.Printf("i2類型%T\n",i2)
輸出結(jié)果
i2十進(jìn)制:63
i2八進(jìn)制:77
i2類型int
定義十六進(jìn)制
從0到f,逢十六進(jìn)一
i3 := 0x1234567
fmt.Printf("i3十進(jìn)制:%d\n", i3)
fmt.Printf("i3十流進(jìn)制:%x\n", i3)
// %T 查看變量的類型
fmt.Printf("i3十進(jìn)制數(shù)據(jù)類型:%T\n", i3)
輸出結(jié)果
i3十進(jìn)制:19088743
i3十六進(jìn)制:1234567
i3十進(jìn)制數(shù)據(jù)類型:int
總結(jié):我們發(fā)現(xiàn)直接定義十進(jìn)制、八進(jìn)制、十六進(jìn)制的變量,變量的類型都是int型。
拋出問題
我們怎么定義int8/int16/int32/int64類型的數(shù)據(jù)呢?
其實非常簡單:
i4 := int8(1)
i5 := int16(1)
i6 := int32(1)
i7 := int64(1)
fmt.Printf("i4:%T\n", i4)
fmt.Printf("i5:%T\n",i5)
fmt.Printf("i6:%T\n",i6)
fmt.Printf("i7:%T\n",i7)
輸出結(jié)果:
i4:int8
i5:int16
i6:int32
i7:int64
拋出問題:go有這么多種int類型,我們怎么選擇使用哪種呢?
給出答案:
我們首先要知道這些類型的區(qū)別:
- int8類型大小為 1 字節(jié)
- int16類型大小為 2 字節(jié)
- int32類型大小為 4 字節(jié)
- int64類型大小為 8 字節(jié)
- int類型的大小為 4個字節(jié) 或者 8個字節(jié)
其中int類型要重點說一下:go語言中的 int 的大小是和操作系統(tǒng)位數(shù)相關(guān)的,如果是32位操作系統(tǒng),int 類型的大小就是4字節(jié)。如果是64位操作系統(tǒng),int 類型的大小就是8個字節(jié)。
由此我們可以知道,根據(jù)自己需要的字節(jié)數(shù)來選擇,當(dāng)然選擇int類型是最省心安全的,但是當(dāng)我們?nèi)≈捣秶〉臅r候,會浪費存儲空間。
float
go中的float可以細(xì)分為:float32和float64
定義float
f1 := 1.0
fmt.Printf("f1類型:%T\n", f1) // Go語言中的小數(shù)默認(rèn)類型是:float64
輸出結(jié)果:
f1類型:float64
分析:在未指定類型定義float時,默認(rèn)的類型是float64。和int類型的定義是一致的。
反思:這種設(shè)計我們也可以很好理解,出于數(shù)據(jù)安全的考慮,設(shè)置數(shù)據(jù)類型對應(yīng)的最大內(nèi)存空間的類型,避免內(nèi)存溢出等問題。
定義float32類型
聰明的你一定會想到,和定義int8是一樣的
f2 := float32(1.4321)
fmt.Printf("%T\n", f2)
輸出結(jié)果:
f2類型:float32
小技巧
我們可以通過內(nèi)置的Math函數(shù),獲得常用的數(shù)值,比如:
var maxFloat = math.MaxFloat32;
println(maxFloat)
輸出結(jié)果:
+3.402823e+038
注意
在go中,數(shù)據(jù)類型是有嚴(yán)格的區(qū)分的,不同類型之間是不能互相轉(zhuǎn)換的,比如:
圖片
bool類型
定義
b1 := true
fmt.Printf("b1類型:%T\n", b1)
輸出結(jié)果:
b1類型:bool
默認(rèn)值為false
var b2 bool
// 前面有2個% 后面也要傳2次參數(shù)
fmt.Printf("b2類型為:%T 值為: %v\n", b2, b2)
輸出結(jié)果:
b2類型為:bool 值為: false
字符串
- Go語言中的字符串是由雙引號包裹的
s1 := "123"
s2 := "我們"
s3 := "mystring"
- go語言中單引號包裹的是字符(單獨的字母,漢字,符號,數(shù)字)
s1 := '1'
s2 := '我'
s3 := 's'
// 字節(jié):1個字節(jié)=8Bit(8個二進(jìn)制位)
// 一個字符'A' = 1個字節(jié)
// 一個utf8編碼的漢字一般占3個字節(jié) (比如‘沙’)
rune
rune它是int32的別名(-2147483648~2147483647),相比于byte(-128~127),可表示的字符更多。由于rune可表示的范圍更大,所以能處理一切字符,當(dāng)然也包括中文字符。在平時計算中文字符,可用rune。
當(dāng)我們數(shù)據(jù)中有中文時,一定要注意rune的處理。
len()詳解
len()獲得的是 byte 字節(jié)的數(shù)量,一個中文占用3個字節(jié)
s := "Hello王"
sHello := "Hello"
sWang := "王"
//len()獲得的是 byte 字節(jié)的數(shù)量
fmt.Println(len(s))
fmt.Println(len(sHello))
fmt.Println(len(sWang))
輸出結(jié)果是:8 5 3
循環(huán)輸出字符串
s := "Hello王"
for i := 0; i < len(s); i++ {
fmt.Printf("%c\n", s[i])
}
輸出結(jié)果:
圖片
我們發(fā)現(xiàn)英文可以正常輸出,但是中文通過這種方式輸出會亂碼
循環(huán)輸出中文字符串
我們可以通過for range循環(huán),從字符串中拿出具體的字符
s := "Hello王"
for _, c := range s {
fmt.Printf("%c\n", c) //%c 字符
}
輸出結(jié)果:
圖片
字符串的修改
字符串修改是不能直接修改的,需要轉(zhuǎn)成rune切片后再修改
s2 := "小白兔"
s3 := []rune(s2) //把字符串強(qiáng)制轉(zhuǎn)成rune切片
s3[0] = '大' //注意 這里需要使用單引號的字符,而不是雙引號的字符串
fmt.Println(string(s3)) //把rune類型的s3強(qiáng)轉(zhuǎn)成字符串
輸出結(jié)果:大白兔
字符和字符串的區(qū)別
c1 := "紅"
c2 := '紅'
fmt.Printf("c1的類型:%T c2的類型:%T \n", c1, c2)
c3 := "H"
c4 := 'H'
fmt.Printf("c3的類型:%T c4的類型:%T \n", c3, c4)
輸出結(jié)果:
c1的類型:string c2的類型:int32
c3的類型:string c4的類型:int32
總結(jié):我們發(fā)現(xiàn)只要是雙引號包裹的類型就是string,只要是單引號包裹的類型就是int32,也就是rune。和中英文無關(guān)。
知識點:rune的別名是int32
類型轉(zhuǎn)換
n1 := 10
var f float64
f = float64(n1)
fmt.Printf("f的類型是:%T f的值是:%v\n", f,f)
輸出結(jié)果:
f的類型是:float64 f的值是:10
總結(jié)
- Go語言中對類型有嚴(yán)格的要求,不同類型之間不能直接轉(zhuǎn)換,哪怕int8/int16之間也不能轉(zhuǎn)換。
- 聲明變量同時賦值的方式,如果沒有指定明確的數(shù)據(jù)類型,會默認(rèn)使用范圍大的類型,比如:int、float64、false。
- 字符串的修改要轉(zhuǎn)成rune切片,而不能像PHP一樣直接修改。
本文轉(zhuǎn)載自微信公眾號「王中陽Go」,作者「王中陽Go」,可以通過以下二維碼關(guān)注。
轉(zhuǎn)載本文請聯(lián)系「王中陽Go」公眾號。