天天看點

從零學 Go:原生資料類型

前面一篇文章介紹了 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求索