Go語言2-基礎類型及使用

1、變量

 1)變量聲明
 格式:var 變量名 變量類型
     var v1 int
     var v2 string
     var v3 [10]int         //整型數組
     var v4 []int           //切片
     var v5 struct {        //結構
         f int
     }
     var v6 *int            //指針
     var v7 map[string]int  //map,key爲string類型,value爲int類型
     var v8 func(a int) int
     var (                  //多個var 省略爲一個
         v1 int
         v2 string
     )
 2)變量初始化
 格式1:變量名 = 值         //注:此處的v1必須是已聲明的
    v1 = 10
 格式2:變量名 := 值        //注:此處的V1必須是未聲明的
    v1 := 10
 格式3:var 變量名 = 值     //注:該格式爲聲明時直接賦值
     var v1 = 10
 3)變量賦值
 格式:變量名 = 值
     v1 = 10
 這裏介紹下Go語言的一個小特性
    i,j = j,i
 上面語句的意思爲將i與j的值對調,如果在Java中實現該賦值,則需要引入臨時變量


 4)匿名變量
 匿名變量一般在多返回值函數時使用,當調用一個多返回值函數時,爲了只獲取一個值,
 又不想給每個返回值都定義一個變量名,此時就可以使用匿名變量,使用“_”來進行佔位
    ret1,_:= MutipleReturnFunc()

2、常量

 1)字面常量
 所謂字面常量是指程序中硬編碼的常量
     -12
     3.1415926
     true
     "foo"
 2)常量定義
 格式:const 常量名 [類型] [= 常量值] //[]表示可以沒有該內容
     const Pi float64 = 3.1415926
          const zero = 0.0
          const (
              size int64 = 1024
              eof = -1
     )
     const u,v float64 = 0,3     //u=0.0,v=3.0 常量多重賦值
     const mask = 1 << 3         //編譯期行爲表達式,不可以是運行期表達式
 3)預定義常量
 Go言預定義了三個常量:true、false和iota
 iota比較特殊,可以被認爲是一個可被編譯器個性的常量,在每個const關鍵字出現時被重置爲0,
 在下個const出現之前,每出現一次iota其所代表的數字會自動增1
     const (
          Byte = 1 << (10 * iota)          //Byte = 1
          KB   = 1 << (10 * iota)          //KB   = 1024
          MB   = 1 << (10 * iota)          //MB   = 1048576
          GB   = 1 << (10 * iota)          //GB   = 1073741824
     )
     const v1 = iota                       //0,iota又重設爲0了
 注:這裏有一個小特性,在Go中,如果在同一個const第一個常量在定義時進行了賦值,
 而後續其它常量沒有進行賦值,則後續常量將延用第一個賦的值或表達式
 如下面的定義語句等同於上面的語句
     const (
          Byte = 1 << (10 * iota)          //Byte = 1
          KB                               //KB   = 1024
          MB                               //MB   = 1048576
          GB                               //GB   = 1073741824
     )
 4)枚舉
 Go語言工不支持enum關鍵字來定義枚舉,因此Go語言的枚舉其實只是一系列相關常量
     const (
          Sunday = iota
          Monday
          Tuesday
          Wednesday
          Thursday
          Friday
          Saturday
     )

3、數據類型(基礎)
Go語言的數據類型包含以下幾種基礎類型和複合類型(將在另外一篇博文中講解)

 基礎類型:
 1)布爾類型:bool,不支持其它類型的轉換(除使用函數外)

 2)整型
     int8   :[-128,127]
     int16  :[-32768,32767]
     int32  :[-2 147 483 648,2 147 483 647]
     int64  :[-9 223 372 036 854 775 808,9 223 372 036 854 775 807]
     int    :依賴不同平臺下的實現,可以是int32(大小)或int64(大小),自動推導
     uint8  :又名byte,[0,255]
     uint16 :[0,65535]
     uint32 :又名rune,[0,4 294 967 295]
     uint64 :[0,18 446 744 073 709 551 615]
     uint   :依賴不同平臺下的實現,可以是uint32(大小)或uint64(大小)
     uintprt:恰好容納指針值的類型,對32位平臺是unit32,對64位平臺是unit64
 注:不同類型的整型被認爲是不同類型,它們之間無法做賦值、比較運算。
    在Go語言中,沒有++與--操作符,僅有"值++"與"值--"語法
 如下面的寫法爲錯誤寫法。
     var v1 int32
     v2 := 64                 //v2被自動推導爲int類型
     v1 = v2                  //不管爲幾位系統均編譯錯誤
     v1 = int32(v2)           //顯示類型轉換
     equal := (v1 == v2)      //編譯錯誤
     v1++                     //正確,中間不能有空格
     ++v1                     //編譯錯誤
 3)浮點型:float32 float64(自動推導)
 同整型一樣,不同類型的浮點型是被認爲是不同類型他們之間無法做賦值、比較運算。
 因爲浮點數不是一種精確的表達方式(計算機爲二進制,二進制無法準確的表示小數),
 所以如果直接使用==判斷兩個浮點數是否相等可能會導致不穩定的結果,這裏給出一個替代方案
     var v1, v2 float64 = 3.14, 3.14
     fmt.Println(v1 == v2)                 //在這裏,本行打印爲true
     fmt.Println(math.Dim(v1, v2) < 0.01)  //0.01表示精度,本行打印爲true
 4)字符串類型:string
 使用""(雙引號,轉義符會被轉義)或者``(反引號,字符保持不變)來創建
 字符串類型支持"+="及"+"操作符進行這符串連接
     str1      := "Hello"        //字符串賦值
     str        ="Hello\nWorld"  //打印str的話,會有換行
     str        =`Hello\nWorld`  //打印結果Hello\nWorld
     firstChar := str1[0]        //取字符串第一個字符
     str1[0]    = 'h'            //編譯錯誤,字符串的內容不能在初始化後被修改
     str       := str1 +" World" //字符中連接操作
     strLen    := lent(str)      //字符串長度,這裏的值爲11
     strCn     :="Hello,世界"    //包含中文的字符串
     strCnLen  := lent(strCn)    //字符串長度,這裏的值爲12,在UTF-8中,一箇中文佔三個字節
     str       +="appendStr"     //追加字符串
     str        ="Hello"+"World" //拼接字符串
     str        ="Hello"+
                 "World"         //+號不能放在行首
     str        ="Hello"
                 +"World"        //編譯錯誤
     sb        := bytes.Buffer{} //使用buffer拼接
     sb.WriteString("hello ")
     sb.WriteString("world")
     str       := sb.String()
 5)字符類型:
 使用''(單引號)創建
 byte,實際上是uint8的別名,代表UTF-8字符串的單個字節值
 rune,代表單個Unicode字符

 6)類型的零值(變量被聲明爲某種類型後的默認值)
 通常情況下,數值類型的默認值爲0,bool爲false,string爲空字符串

 7)類型轉換
 Go語言不支持隱式轉換,所有類型轉換必須顯式聲明,Go是一個類型安全的編程語言
 轉換隻有發生在兩種相互兼容的類型之間
 格式:ValueA [:]= TypeOfValueA(ValueB)
     var a float64 = 1.1
     b := int(a)                  //會發生精度損失
     var c bool  = false
     d := int(c)                  //編譯錯誤
 這裏在講一下比較常見的int->string,string->int,這個無法直接轉換,需要藉助strconv包
     str  := strconv.Itoa(intV)
     intV := strconv.Atoi(str)

至此,基礎類型及使用已經講解完,後續還會有其它的Go語言博文。

這裏也給大家推薦一篇外文的翻譯,《Java程序員快速入門 go 語言》(英文原文:Go for Java programmers),這篇文章對於Java程序員入門Go語言是個好文章。

無聞(unknow)《Go編程基礎》
許式偉的 《Go語言編程》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章