31 Go 語言中的結構體和"面向物件"
阿新 • • 發佈:2020-06-25
1. 結構體型別
想要模擬面向物件就首先要了解一下 Go 語言中的結構體型別。當你需要兩個以上的基本資料型別或自定義型別來宣告定義函式的時候,你就可以使用結構體。結構體變數使用struct{...}
的形式來定義。
程式碼示例:
package main
import (
"fmt"
"reflect"
)
func main() {
var student1 struct {
Name string
Age int
}
student1.Name = "Codey"
student1.Age = 18
fmt. Println("student1資料型別:", reflect.TypeOf(student1))
fmt.Println("student1的值:", reflect.ValueOf(student1))
student2 := struct {
Name string
Age int
}{
Name: "Codey",
Age: 18, //這個逗號千萬不能忘記,若是和大括號同行,這個逗號才可以省略
}
fmt.Println("student2資料型別:", reflect.TypeOf (student2))
fmt.Println("student2的值:", reflect.ValueOf(student2))
}
- 第 9~12 行:宣告一個結構體變數 student1,其屬性為 string 型別的 Name 和 int 型別的 Age。
- 第 13 行:給結構體變數的 Name 屬性賦值。
- 第 14 行:給結構體變數的 Age 屬性賦值。
- 第 19~25 行:定義一個結構體變數 student2,其屬性為 string 型別的 Name 和 int 型別的 Age,並賦初值。
執行結果:
2. 使用自定義型別來模擬物件
使用自定義資料型別的方式來自定義一個結構體型別,這樣就可以達到定義一個物件的相同效果。
程式碼示例:
package main
import (
"fmt"
"reflect"
)
type Student struct {
Name string
Age int
}
func main() {
var student1 Student
student1.Name = "Codey"
student1.Age = 18
fmt.Println("student1資料型別:", reflect.TypeOf(student1))
fmt.Println("student1的值:", reflect.ValueOf(student1))
}
- 第 8~11 行:自定義一個結構體資料型別 Student。也可以解讀為,建立一個"Student類";
- 第 14 行:宣告一個 Student 型別的變數 student1。也可以解讀為,建立一個"Student物件"。
執行結果:
3. 使用函式來模擬面向物件的方法
Go 語言中的函式為自定義資料型別提供了一種特別的使用方式,形如func(變數名 自定義資料型別)函式名(...){...}
。函式名前可以接收一個自定資料型別的引數,引數傳遞的形式為自定義資料型別變數.函式名()
的形式傳遞,這樣外表看起來就和麵向物件程式設計一致了。
程式碼示例:
package main
import (
"fmt"
)
type Student struct {
Name string
Age int
}
func newStudent(name string, age int) Student {
return Student{Name: name, Age: age}
}
func (s Student) PrintAge() {
fmt.Println(s.Age)
}
func main() {
student1 := newStudent("Codey", 18)
student2 := newStudent("Tom", 19)
fmt.Println("student1年齡:")
student1.PrintAge()
fmt.Println("student2年齡:")
student2.PrintAge()
}
- 第 15~17 行:列印傳入的 Student 自定義型別引數 Age 屬性。也可以解讀為建立一個列印學生"物件"年齡的"方法";
- 第 22 行:使用自定義型別變數 student1 為引數呼叫 PrintAge。也可也解讀為 student1 "物件"呼叫PrintAge “方法”。
4. 小結
本文主要介紹了 Go 語言中另類的面向物件。Go 語言中雖然沒有真正意義上的面向物件,但是它可以通過結構體+自定義資料型別的方式對面向物件進行模擬。所以可見 Go 語言是一個非常靈活的語言,它的走向和創造力完全取決於開發者的思維方式。