Go(6) - type, struct
C 語言沒有 class,一般為了在 C 裡面實現類似 class 的功能會在 struct 掛上很多 function pointer。
Go 語言很像 C 語言,有 pointer 及 struct 但沒有 class。宣告 struct 時可以把 function 附加上去。
1. type:
type 可以用於建立一個新的型別或是建立型別的別名。
利用 "type 別名 = 型別" 可以建立型別的別名,使用得當可以增加程式的可讀性。
type myInt = int
func main() {
var a myInt = 10
fmt.Printf("Type of a is: %T\n", a) // Type of a is: int
}
利用 "type 新型別 型別" 可以建立新型別,這是 struct 的基礎。
type newInt int
func main() {
var a newInt = 10
fmt.Printf("Type of a is: %T\n", a) // Type of a is: main.newInt
}
2. struct:
上面利用 type 建立一個新的型別,我們可以把某種 struct 當成一種新的型別並定義一個名稱。
建立 Dog 型別,它是一種具有 name 和 int 的 struct。
type Dog struct {
Name string
Age int
}
func main() {
d := Dog{"White", 10} // 初始化
fmt.Println(d.Name)
fmt.Println(d.Age)
fmt.Printf("Type of d is: %T\n", d) // Type of d is: main.Dog
}
3. 幫 struct 添加 function:
我們可以幫 struct 添加 function,讓它更像 class。
幫 Dog 添加 Bark(),需要注意的是 d 是一個新拷貝出來的物件 (晚點我們會證明)。
type Dog struct {
Name string
Age int
}
func (d Dog) Bark() { // 拷貝建立 d 再呼叫 Bark()
fmt.Println("Bark bark!")
}
func main() {
d := Dog{"White", 10}
d.Bark()
}
4. 使用 pointer 傳遞 instance:
我們想新增一個 Grow() 並希望它能幫 Dog 增加年紀。
type Dog struct {
Name string
Age int
}
func (d Dog) Grow() {
d.Age += 1
}
func main() {
d := Dog{"White", 10}
d.Grow()
fmt.Println(d.Age) // 10
}
!! 注意 !! 上面的 d 在 Grow 後歲數並沒有增加,原因是因為呼叫 Grow() 的對象是新拷貝出來的 Dog。
我們利用 Dog 的 pointer 呼叫 Grow(),d.Age += 1 的對象是由傳入的 pointer 決定。
type Dog struct {
Name string
Age int
}
func (d *Dog) Grow() {
fmt.Printf("Address (Grow): %p\n", d)
d.Age += 1
}
func main() {
d := Dog{"White", 10}
fmt.Printf("Address (main): %p\n", &d)
d.Grow()
fmt.Println(d.Age) // 11
}
不論你要不要修改 struct 的資料都應該使用 pointer 傳遞 instance,因為使用 pointer 可以免去不必要的拷貝。

留言
張貼留言