Go是一種強(qiáng)類(lèi)型的靜態(tài)編譯語(yǔ)言
Go語(yǔ)言內(nèi)置了七類(lèi)基本數(shù)據(jù)類(lèi)型
? 布爾類(lèi)型:bool
var ok bool = true
var ok bool = 1 //error 1是整型字面量
? 整型:byte int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr
var a int = 1
var b int32 = 2
b = a //error 不同類(lèi)型的整型必須進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換
? 浮點(diǎn)型:float32 float64
var b := 10.00 //浮點(diǎn)數(shù)字面量被自動(dòng)推斷為float64類(lèi)型
? 復(fù)數(shù):complex64 complex128
complex64是由兩個(gè)float32構(gòu)成的,complex128是由兩個(gè)float64構(gòu)成的
var value1 complex64 = 3.1 + 5i
value2 := 3.1 + 6.i
var v = complex(2.1, 3) //構(gòu)造一個(gè)復(fù)數(shù)
a := real(v) //返回實(shí)數(shù)部分
b := image(v) //返回復(fù)數(shù)虛部
? 字符串:string
? 字符串是常量,可以通過(guò)索引訪問(wèn)字節(jié)單元,但是不能修改
var a = "hello world"
b := a[0]
a[1] = 'b' //error
? 字符串轉(zhuǎn)換成[]bytes要慎用,當(dāng)字符串太大的時(shí)候,要復(fù)制一份內(nèi)存
a := "hello, world"
b := []byte(a)
? 字符串尾部不包含NULL字符,跟C和C++不一樣
? 字符串類(lèi)型底層實(shí)現(xiàn)是一個(gè)二元的數(shù)據(jù)結(jié)構(gòu),一個(gè)指針指向字節(jié)數(shù)組的起點(diǎn),另一個(gè)是長(zhǎng)度
// runtime/string.go
type stringStruct struct {
str unsafe.Pointer
len int
}
? 基于字符串創(chuàng)建的切片和原字符串指向的相同的底層字符數(shù)組(視圖),一樣不能修改,對(duì)于字符串切片操作返回的子串仍然是string,而非slice
a := "hello world"
b := a[0:4]
c := a[1:]
? 字符串可以轉(zhuǎn)換成字節(jié)數(shù)組,也可以轉(zhuǎn)換成Unicode的字節(jié)數(shù)組
a := "hello world"
b := []byte(a)
c := []rune(a) //轉(zhuǎn)成Unicode的字節(jié)數(shù)組
? 字符串的運(yùn)算
a := "hello"
b := "world"
c := a + b
len(a)
? rune類(lèi)型
Go內(nèi)置兩種字符類(lèi)型,一種byte的字節(jié)類(lèi)型(byte是uint的別名),另一種是標(biāo)識(shí)Unicode編碼的字符rune,rune在Go內(nèi)部是int32類(lèi)型的別名,占用4個(gè)字節(jié),Go語(yǔ)言默認(rèn)是Utf-8類(lèi)型
參考<<Go語(yǔ)言核心編程>>