天天看點

GO語言總結(2)——基本類型

  上篇博文總結了Go語言的基礎知識——GO語言總結(1)——基本知識  ,本篇博文介紹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語言列印指向結構體的指針時,會列印解引用後的結構體内容,同時會将&作為字首,表示它是一個指針。

值得注意的是,如果Type不是一個可以用大括号初始化的類型,那就隻能使用内置函數 new(Type)了。如下:

func test5() {
    //建立一個int變量,并獲得它的指針
    var1 := new(int)
    //var1 := &int32{}
    fmt.Printf("%T->%v\n", var1, var1)
}      

int不可以使用大括号初始化,是以第二種會報錯,注釋掉後,輸出:

*int->0xc082006270      

參考:《Go語言程式設計》

/**

*   ————————如果覺得本博文還行,别忘了推薦一下哦,謝謝!

*   作者:錢書康

*   歡迎轉載,請保留此段聲明。

*   出處:http://www.cnblogs.com/zrtqsk/

*/

上一篇: 棧類Stack
下一篇: STL之stack棧