這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
golang有如下基本類型:
- 整數類型: int8、int16等等
- 浮點類型:float32、float64
- 布爾類型:bool
- 複數類型: complex64、complex128
- 字串類型: string
- 字元類型: byte、rune
整數類型
整型轉換
golang中的編譯器不會做隱式的類型轉換,int和int32是倆種不同的類型。
var value2 int32value1 := 64 // value1將會被自動推導為 int類型value2 = value1 // 編譯錯誤value2 = int32(value1) // 強制類型轉換編譯通過
在做強制類型轉換時,需要注意資料長度被截短而發生的資料精度損失(比如將浮點數強制轉為整數)和值溢出(值超過轉換的目標類型的值範圍時)問題。
整型運算
golang支援常規的整數運算: + - * / % 即加減乘除模數運算。
整型比較
golang支援常規的比較子: > < == >= <= !=
需要注意的是兩種不同的整數類型變數不能直接比較,比如int8類型變數和int類型變數不能直接比較,但是整型常量編譯器會自動推斷類型,所以整型常量可以與任何整型變數比較。
var x int8var y int16x = 1y = 1if x == y { // 編譯錯誤 fmt.Println("x == y")}if x == 1 && y == 1 { // 編譯通過 fmt.Println("x == y")}
位元運算
布爾類型
golang中的布爾類型,關鍵字為bool,預定義的值為true和false
bool類型不支援自動和強制的類型轉換,只能通過預定義的值進行賦值,還有通過比較運算式推導。
var v1 boolv1 = truev2 := (1 == 2) // v2也會被推導為 bool類型,值為falsev1 = 1 // 編譯錯誤不支援隱式類型轉換v1 = bool(1) // 編譯錯誤不支援強制類型轉換v1 = (1 == 2) // 編譯成功,值為false
浮點類型
golang中的浮點類型採用IEEE-754標準的表達方式。
浮點類型轉換
golang中的浮點類型共有倆個float32和float64,同c語言中的float和double。
var f1 float32f1 = 1f2 := 1.0 // 如果想讓f2被推導成浮點型,必須加.0, 否則被推導為整型而不是浮點型f1 = f2 // 編譯錯誤,浮點型會被自動推導成float64f1 = float32(f2) // 編譯成功
浮點類型比較
浮點數的比較需要注意的是精度問題,像整型直接用==判斷倆浮點數是否相等是不可行的,
會產生不穩定的結果,所以實現一個浮點數的比較函數用來判等是可行的。
import "math"func IsEqual(f1, f2, p float64) bool { // p為使用者自訂的比較精度,小於比較精度就可認為相等 return math.Fdim(f1, f2) < p }
複數類型
複數是由倆個實數(浮點數表示)構成的,一個實部(real),一個虛部(image)。可以通過函數real(v)擷取複數的實部,函數image(v)擷取複數的虛部。
var v1 complex64 // 由2個float32構成的複數類型v1 = 1.2 + 12iv2 := 1.2 + 12i // v2 是complex128類型v3 := complex(1.2, 12) // v3 等於 v2x := real(v1) // x值為1.2y := real(v1) // y值為12
字元類型
golang中支援兩種字元類型,一種是byte(實際上是uint8的別名),代表UTF-8字串的單個位元組的值;另一種是rune,代表單個Unicode字元。unicode/utf8 包也提供了UTF8和Unicode之間的轉換。
字串操作
golang中字串也是一種基本類型,相比c/c++而且golang中的字串使用起來非常方便。
初始化:
var str1 string // 聲明一個字串變數str1 = "Hello world" // 字串賦值ch := str1[0] // 取字串的第一個字元str2 := "Hello world" // 直接初始化,推導為string類型str2[0] = 'a' // 編譯錯誤,不支援初始化後修改內容str1 = str1 + str2 // str1的值變為了Hello worldHello world
字串的內容擷取與數組類似,都支援下標方式擷取。不同的數組可以修改內容,字串初始化後不能修改內容。字串支援串連操作,用+運算子實現。
字串遍曆
字串有倆種遍曆方式,一種是按byte字元遍曆,一種是按rune字元遍曆。
//按byte字元遍曆str := "Hello, 世界"for i := 0; i < len(str); i++ { // 利用下標取字串中的字元,類型為 byte ch := str[i] fmt.Println(i, ch)}//按rune字元遍曆str := "Hello, 世界"for i, ch := range str { // ch的類型為 rune,i為rune的索引下標 fmt.Println(i, ch)}
golang技術交流QQ群,歡迎志同道合的人一起來探討技術人生