1. 程式人生 > 其它 >GO語言基本型別分析

GO語言基本型別分析

一、整型

go語言有13種整形,其中有2種只是名字不同,實質是一樣的,所以,實質上go語言有11種整形。如下:

(1)int :依賴不同平臺下的實現,可以是int32或int64

(2)int8 : (-128->127)

(3)int16: (-32768->32767)

(4)int32: (-2 147 483 648->2 147 483 647)

(5)int64 :(-9 223 372 036 854 775 808->9 223 372 036 854 775 807)

(6)unit : 依賴不同平臺下的實現,可以是int32或int64

(7)unit8 (又名byte): (0->255)

(8)unit16 : (0->65535)

(9)unit32 (又名rune):  (0->4 294 967 295)

(10)unit64 : (0->18 446 744 073 709 551 615)

(11)unitptr : 恰好容納指標值的型別,對32位平臺是unit32,對64位平臺是unit64

(PS : 值得注意的是,go語言中沒有自動型別轉換,這意味著,除了上篇博文分析的比較運算子之外,其他的操作符基本需要型別轉換,才能進行操作。否則就是編譯錯誤)

二、浮點型別

go語言有2種類型的浮點和兩種型別的複數型別。

(1) float32(-3.402...×1038->3.402...×1038)

(2) float64(-1.797...×10308->+1.797...×10308)

(3) complex64( 實部、虛部都是一個float32 )

(4) complex128  ( 實部、虛部都是一個float64 )

(PS:標準庫math包中,包含了眾多數學函式,其中所有函式均使用float64,

標準庫math/cmplx包含眾多複數相關的數學函式,其中所有函式均使用complex128)

(PPS : 跟數學中一樣,Go語言使用字尾 i 表示複數,例如 5 + 5.1i )

三、字串

Go語言的字串是用UTF-8編碼的變寬字元序列,每個字元都用一個或多個位元組表示。這與Java不同,Java是採用UTF-16來表示,每個字元都對應2個位元組。

(1)建立:一種是用雙引號(")括起來,它表示可解析的字串,可以進行字元轉義。另一種是用單引號(')括起來,它表示原生的字串,可以包含除反引號之外的任何字元,當然也可以換行。如下: 

複製程式碼程式碼如下:

func test1() { str1 := ""it's me!"" str2 := `"it's me,too"` fmt.Println(str1) fmt.Println(str2) }

輸出為:

"it's me!" "it's me,too" (2)Go語言的字串支援 “+=”操作,可以通過[n]獲取索引處的原始位元組、通過[n:m]、[n:]、[:m]來獲取位元組對應的字串,若字元被截段,顯示亂碼。如:

複製程式碼程式碼如下:

func test1() { str1 := "Go語言的字串是用UTF-8編碼的變寬字元序列,每個字元都用一個或多個位元組表示。" fmt.Println(str1[4:15]) fmt.Println(str1[5:15]) fmt.Println(str1[5]) fmt.Println(str1[:5]) fmt.Println(len(str1)) //位元組數 fmt.Println(len([]rune(str1))) //字元數 }

輸出為 :

�言的字� 言的字� 232 Go語 109 41

(3)字串支援常規的比較運算子操作,比較運算子在記憶體中一個位元組一個位元組的比較字串。當然了,這個比較是按照utf-8編碼的順序進行比較的。

(4)上例的最後一個取字元數的操作:len([]rune(str1)),在Go語言中,一個字串可以可以用一個rune(又名int32)陣列來表示,每個rune都表示一個單一的字元。如:

複製程式碼程式碼如下:

func test1() { str1 := "Go語言的字串是用UTF-8編碼的變寬字元序列,每個字元都用一個或多個位元組表示。" for _, char := range []rune(str1) { fmt.Println(char) } }

這個操作會將str1的每個字元數字直接打印出來

四、指標

(1)指標的本質,用一個簡單例子說明一下:

複製程式碼程式碼如下:

func test2() { a := "xyz" b := "opq" pa := &a //pa為指向a的指標 pp := &pa //pp為指向pa的指標 fmt.Println(a, b, *pa, **pp) a += "zz" //a追加“zz” fmt.Println(a, b, *pa, **pp) *pa += "bb" //pp指向的值,追加"bb" fmt.Println(a, b, *pa, **pp) fmt.Println("列印a各種情況:", &a, a) fmt.Println("列印pa各種情況:", &pa, pa, *pa) fmt.Println("列印pp各種情況:", &pp, pp, *pp, **pp) }

輸出如下:

xyz opq xyz xyz xyzzz opq xyzzz xyzzz xyzzzbb opq xyzzzbb xyzzzbb 列印a各種情況: 0xc0820001d0 xyzzzbb 列印pa各種情況: 0xc082038018 0xc0820001d0 xyzzzbb 列印pp各種情況: 0xc082038020 0xc082038018 0xc0820001d0 xyzzzbb

可見,指標的本質就是一個存放邏輯地址的變數。

(2)有兩種建立變數的語法,同時獲得指向它們的指標:new(Type) 和 &Type{}, 如下:

type point struct {
    x int
    y int
}
func test3() {
    a := point{1, 2}
    b := new(point)
    c := &point{}
    d := &point{3, 4}
    fmt.Println(a, b, c, d)
}

輸出為:

{1 2} &{0 0} &{0 0} &{3 4}

Go語言列印指向結構體的指標時,會列印解引用後的結構體內容,同時會將&作為字首,表示它是一個指標。