前面一篇文章介紹了 Go 基本文法,變量的聲明與初始化。本文将會具體介紹 Go 原生資料類型。Go 語言中具備豐富的資料類型,基本類型有整型、浮點數、布爾型、字元串型等,除此之外,還有切片、結構體、指針、通道、map、數組等其他類型。
原生資料類型
本文中我們主要介紹 Golang 的基礎類型。 整型中主要有兩大類,分别是:
- 按照整型的長度劃分:int8、int16、int32、int64
- 按照有無符号劃分:uint8、uint16、uint32、uint64
除此之外,Golang 中還提供了平台自比對長度的
int
和
uint
類型。 整型類型之間可以互相轉換,高長度類型向低長度類型轉換會發生長度截取,僅會保留高長度類型的低位值,造成轉換錯誤,實際使用需要注意。如下例子所示:
var e uint16 = math.MaxUint8 + 1
fmt.Printf("e valud(unit16) is %v\n", e)
var d = uint8(e)
fmt.Printf("d valud(unit8) is %v\n", d)
輸出如下所示:
e valud(unit16) is 256
d valud(unit8) is 0
因為 256 在
uint16
底層的存儲方式為
00000001 00000000
,轉換為
uint8
之後,隻截取後 8 位,導緻 d 變為
00000000
,即 0。
浮點型主要有兩種:
- float32,最大範圍位為 3.40282346638528859811704183484516925440e+38
- float64,最大範圍為 1.797693134862315708145274237317043567981e+308
列印浮點型精度與 C 語言一緻,可以配合
%f
使用,如下例子所示:
fmt.Printf("%f\n", math.E) //按照預設寬度和精度輸出
fmt.Printf("%.2f\n", math.E) //按照預設寬度和 2 位精度輸出
float32 和 float64 之間也可以進行類型轉換,仍然需要注意轉換期間精度的損失。
Golang 的布爾型即我們常見的
true
fasle
。與 C 語言不同,Golang 的布爾型不可與整型進行強轉,也無法參與數值運算。
在 Golang 中,字元串型以原生資料類型出現,地位等價于其他的基本類型(整型、布爾型等),它基于 UTF-8 編碼實作,是以在周遊字元串型時,我們需要區分
byte
rune
。
f := "Golang 程式設計"
fmt.Printf("byte len of f is %v\n", len(f))
fmt.Printf("rune len of f is %v\n", utf8.RuneCountInString(f))
上述例子的輸出為:
byte len of f is 12
rune len of f is 8
第一種方式,統計的是
byte
的長度,它的類型為
uint8
,代表了一個 ASCII 字元。第二種方式統計的是 rune 類型,它的類型為
int32
,代表了一個 UTF-8 字元,它可以類比為 Java 中的
char
類型。由于中文字元在 UTF-8 中占用了 3 個位元組,是以使用
len
方法時獲得的中文字元的長度為 6 個
byte
,而
utf8.RuneCountInString()
方法統計的是字元串的 Unicode 字元數量。
在周遊字元串的每個位元組時,我們可以采用以下手段:
f := "Golang 程式設計"
//按位元組周遊字元串
for _, g := range []byte(f){
fmt.Printf("%c", g)
}
輸出的結果為:
Golangç¼ç¨
在進行位元組周遊時候,因為中文字元的 Unicode 字元會被截斷,導緻中文字元輸出亂碼。為了保證每個字元正常輸出,可以通過周遊 rune 的方式周遊字元串中的每個字元,如下所示:
//按字元周遊字元串
for _, h := range f{
fmt.Printf("%c", h)
}
此時輸出的結果就是我們期望的
Golang 程式設計
字元串。
小結
本文主要介紹了 Go 語言的幾種常用的資料類型,對于學習一門語言來說,資料類型是非常基于且必須要會的内容。特别是常用的整型、浮點數、布爾型、字元串型等。下面的文章,我們将介紹指針在 go 語言中的使用。
閱讀最新文章,關注公衆号:aoho求索