go 基礎總結 --- 資料型別

rachel發表於2019-03-25

go 是靜態型別語言, 意味著:

  • 在宣告變數的時候需要指明變數型別
  • 一旦宣告將不再改變

浮點型

var a, b float32 = 3.4, 4.5

在函式內部, 也可以不宣告, 因為 go 在編譯時, 可以根據賦值自動識別變數型別, 此時的書寫規則是, 去掉 var, 賦值符號改為 :=

a, b := 3.4, 4.5

Tips:
在不指明變數型別時, 對於浮點型變數, go 預設為 float64, 而不是 float32. 因此在下面的例子中就會報錯:

package main

import ("fmt")

func add(x,y float32) float32 {
    return x + y
}

func main() {
    var num1, num2 float32 = 3.4, 4.5
    fmt.Println(add(num1, num2))
}

從下面的報錯資訊可以看出, num1 和 num2 被宣告為 float64 型別, 所以這種情況, 必須在宣告時指明變數型別了.
# command-line-arguments
./new.go:13:17: cannot use a (type float64) as type float32 in argument to add
./new.go:13:17: cannot use b (type float64) as type float32 in argument to add

字串型別

注意點在註釋裡標明:

// 返回值的型別不能簡寫 / 省略, 有幾個返回值, 就要寫幾個
func multiple(a, b string) (string, string) {
    return a, b
}

func main() {
    // 字串必須用雙引號, 不能用單引號, 用單引號就變成 rune 型別了
    str1, str2 := "Hello", "World"
    fmt.Println(multiple(str1, str2))
}

關於 rune 型別目前理解到的是:
字串中得每一個元素叫做 "字元". 在遍歷或單個獲取字串元素時可以獲得字元. Go 語言的字元有以下兩種:

  • 一種是 unit8 型別, 或者叫 byte 型, 代表了 ASCII 碼的一個字元.
  • 另一種是 rune 型別, 代表一個 UTF-8 字元. 當需要處理中文, 日文或其他複合字元時, 則需要用到 rune 型別. rune 型別實際是一個 int32.
    var a byte = 'a'
    fmt.Printf("%d %T\n", a, a) // 輸出 97 uint8

    var b rune = '你'
    fmt.Printf("%d %T\n", b, b) // 輸出 20320 int32

資料型別轉換

var a int = 89

    // 資料型別轉換方式
    var b float32 = float32(a)

    x := a

    fmt.Printf("%d %T\n", x, x) // 檢視 x 的資料型別, 輸出為 89 int
    fmt.Printf("%d %T\n", a, a) // 檢視 a 的資料型別, 輸出為 89 int
    fmt.Printf("%f %T\n", b, b) // 檢視 b 的資料型別, 輸出為 89.000000 float32

從上面的輸出可以看出型別轉換函式並不會改變原變數的型別, 體現 go 為靜態型別語言的特點.

以上, 沒有面面俱到, 按部就班的羅列基礎語法, 只記錄我認為容易出錯的點.

相關文章