[A Tour of Go 學習筆記] 02 變數與型別
使用官方教學瞭解 Go 語言變數與型別
初入 Golang 的世界,首先我們使用官方教學:A Tour of Go
來認識基本的 Golang 使用
這篇是變數與型別的筆記
變數
在 Go 語言中使用var
來定義變數,並且和函數的參數列表一樣將型別定義在最後
var
聲明可以出現在 package 或是 function 的作用域內
package main
import "fmt"
var c, python, java bool
func main() {
var i int
fmt.Println(i, c, python, java)
}
/*
>>> 0 false false false
*/
變數預設值
在聲明變數的時後可以定義一個初始值
如果有定義初始值,在聲明的時候可以省略類型
Go 會根據初始值來推斷變數的型別,這點十分聰明!
package main
import "fmt"
// 主動定義變數型別
var i, j int = 1, 2
func main() {
// 省略型別,透過預設值
var c, python, java = true, false, "no!"
fmt.Println(i, j, c, python, java)
}
/*
>>> 1 2 true false no!
*/
短變數聲明
在函數內可以使用:=
來代替使用var
聲明變數
在函數外部,每個語句都以關鍵字(var、func 等)開頭,不可使用:=
package main
import "fmt"
func main() {
var i, j int = 1, 2
k := 3
c, python, java := true, false, "no!"
fmt.Println(i, j, k, c, python, java)
}
/*
>>> 1 2 true false no!
*/
基本型別
Go 的基本型別有
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // alias for uint8
rune // alias for int32
// represents a Unicode code point
float32 float64
complex64 complex128
一般來說int
、uint
和uintptr
的長度和系統位元數一樣
在 32 位元系統中就是 32 位元;在 64 位元系統中就是 64 位元
當你需要整數的時候直接使用int
就好
除非有明確的理由,否則不應該去限制長度
可以使用fmt.Printf
套件來印出變數的格式化輸出內容,包含型別%T
和值%v
package main
import (
"fmt"
"math/cmplx"
)
var (
ToBe bool = false
MaxInt uint64 = 1<<64 - 1
z complex128 = cmplx.Sqrt(-5 + 12i)
)
func main() {
fmt.Printf("Type: %T Value: %v\n", ToBe, ToBe)
fmt.Printf("Type: %T Value: %v\n", MaxInt, MaxInt)
fmt.Printf("Type: %T Value: %v\n", z, z)
}
/*
>>> Type: bool Value: false
>>> Type: uint64 Value: 18446744073709551615
>>> Type: complex128 Value: (2+3i)
*/
Zero values
如果在聲明變數的時候沒有給定預設值
那就會被自動賦予 Zero value
不同型別的 Zero value 分別是
- 數值型別:
0
- 布林型別:
false
- 字串型別:
""
(空字串)
型別轉換
使用T(v)
的形式來將v
型別轉換成T
例如:
var i int = 42
var f float64 = float64(i)
var u uint = uint(f)
或是可以使用更簡短的表達方式:
i := 42
f := float64(i)
u := uint(f)
常數
- 和變數的宣告方式很像,只是改為使用
const
- 內容可以是字元、字串、布林、或數值資料
- 不能使用
:=
聲明
數值常數(Numeric constants)
- 一種高精度的數值
- 根據上下文使用來決定他的數值型別
import "fmt"
const (
// 透過將 1 往左移動 100 位數來創造一個很大的數字(二進制中 1 後面接了 100 個 0)
Big = 1 << 100
// 再往左移 99 位元,變成二進制的「10」也就是十進制的 2
Small = Big >> 99
)
func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
return x * 0.1
}
func main() {
fmt.Println(needInt(Small))
fmt.Println(needFloat(Small))
fmt.Println(needFloat(Big))
}
/*
>>> 21
>>> 0.2
>>> 1.2676506002282295e+29
*/
這時候如果印出needInt(Big)
會發生什麼事情呢?
constant 1267650600228229401496703205376 overflows int
原來是因為我們所使用的系統中,最長的 int 就是 64-bit(有時候會更少)
而我們定義的數值常數Big
是一個 100 位元的正數,所以就造成了 overflow