以下為 Go 中最常使用的型別,這裡要注意的是宣告變數時,變數會有型別的預設值。
int
和 int64
的預設值為 0
( int 有可能是 int32 或 int64,依作業系統而定 )
var a int
var b int64
fmt.Println(a == 0) // true
fmt.Println(b == 0) // true
float64
預設值為 0
var a float64
fmt.Println(a == 0) // true
bool
預設值為 false ( 最常碰到的雷之一 )
var a bool
fmt.Println(a == false) // true
string
預設值為空字串
var a string
fmt.Println(a == "") // true
slice 的預設值為 nil
,slice 通常作為 array 來操作
var slice []int
fmt.Println(slice == nil) // true
如果想建立一個非 nil
的 slice,可以使用 make
函式建立
var slice = make([]int, 0)
fmt.Println(slice)
make
函式的參數為 (型別, 長度, 容量),其中型別為欲建立的 slice 的元素型別,長度為欲建立的 slice 的初始長度,容量為欲建立的 slice 的初始容量。例如:
var slice = make([]int, 5, 10)
fmt.Println(slice) // [0 0 0 0 0]
這樣就建立了一個初始長度為 5,容量為 10 的整數 slice。
append
函式用於在 slice 的末尾添加元素,並返回新的 slice。如果原始 slice 的容量不足以容納新元素,append
函式會自動擴展容量。
var slice = []int{1, 2, 3}
slice = append(slice, 4)
fmt.Println(slice) // [1 2 3 4]
append
函式還可以一次添加多個元素:
var slice = []int{1, 2, 3}
slice = append(slice, 4, 5, 6)
fmt.Println(slice) // [1 2 3 4 5 6]
注意,append
函式返回的是新的 slice,所以必須將其賦值給原始 slice。
map
的預設值為 nil
,map
是一種 key, value 的集合。可以使用 make
函式來建立非 nil
的 map
。
var m map[string]int
fmt.Println(m == nil) // true
m = make(map[string]int)
fmt.Println(m) // map[]
和 class 的概念類似,可以使用 type
關鍵字來定義 struct
。
type Person struct {
Name string
Age int
}
var p Person
p.Name = "John"
p.Age = 30
fmt.Println(p) // {John 30}
interface
可定義一組方法的抽象型別,實現多型性。介面的預設值為nil
。
type Person interface {
eat()
}
var p Person
fmt.Println(p == nil) // true
通常 interface 和 struct 會搭配使用,只要 struct 有實作 interface 上的方法,就可以將該 struct 的實例賦值給 interface 變數。例如:
type Person interface {
PrintName()
}
// ===
type User struct {
Name string
}
func (p *User) PrintName() {
fmt.Println(p.Name)
}
func main() {
var p Person
p = &User{
Name: "John",
}
p.PrintName() // John
}