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 為靜態型別語言的特點.
以上, 沒有面面俱到, 按部就班的羅列基礎語法, 只記錄我認為容易出錯的點.