Go 語(yǔ)言中的結(jié)構(gòu)體和“面向?qū)ο蟆?/h1>
本文主要來(lái)講解一下 Go 語(yǔ)言的結(jié)構(gòu)體數(shù)據(jù)類型,以及 Go 語(yǔ)言中的"面向?qū)ο?,為什么要加雙引號(hào)呢?因?yàn)?Go 語(yǔ)言中沒(méi)有明確的面向?qū)ο蟮母拍睿?dāng)然也沒(méi)有明確的面向過(guò)程的概念。面向哪一方面編程完全取決于你如何使用,如果你想要面向?qū)ο缶幊蹋珿o 語(yǔ)言中提供了相對(duì)應(yīng)的解決方案來(lái)模擬面向?qū)ο蟆?/p>
1. 結(jié)構(gòu)體類型
想要模擬面向?qū)ο缶褪紫纫私庖幌?Go 語(yǔ)言中的結(jié)構(gòu)體類型。當(dāng)你需要兩個(gè)以上的基本數(shù)據(jù)類型或自定義類型來(lái)聲明定義函數(shù)的時(shí)候,你就可以使用結(jié)構(gòu)體。結(jié)構(gòu)體變量使用struct{...}
的形式來(lái)定義。
代碼示例:
代碼塊
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5? ? ? ? ?
"reflect"
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ? ?
var student1 struct {
- 10? ? ? ? ? ? ? ?
Name string
- 11? ? ? ? ? ? ? ?
Age int
- 12? ? ? ?
}
- 13? ? ? ?
student1.Name = "Codey"
- 14? ? ? ?
student1.Age = 18
- 15
- 16? ? ? ?
fmt.Println("student1數(shù)據(jù)類型:", reflect.TypeOf(student1))
- 17? ? ? ?
fmt.Println("student1的值:", reflect.ValueOf(student1))
- 18
- 19? ? ? ?
student2 := struct {
- 20? ? ? ? ? ? ? ?
Name string
- 21? ? ? ? ? ? ? ?
Age int
- 22? ? ? ?
}{
- 23? ? ? ? ? ? ? ?
Name: "Codey",
- 24? ? ? ? ? ? ? ?
Age: 18, //這個(gè)逗號(hào)千萬(wàn)不能忘記,若是和大括號(hào)同行,這個(gè)逗號(hào)才可以省略
- 25? ? ? ?
}
- 26
- 27? ? ? ?
fmt.Println("student2數(shù)據(jù)類型:", reflect.TypeOf(student2))
- 28? ? ? ?
fmt.Println("student2的值:", reflect.ValueOf(student2))
- 29?
}
- 第 9~12 行:聲明一個(gè)結(jié)構(gòu)體變量 student1,其屬性為 string 類型的 Name 和 int 類型的 Age。
- 第 13 行:給結(jié)構(gòu)體變量的 Name 屬性賦值。
- 第 14 行:給結(jié)構(gòu)體變量的 Age 屬性賦值。
- 第 19~25 行:定義一個(gè)結(jié)構(gòu)體變量 student2,其屬性為 string 類型的 Name 和 int 類型的 Age,并賦初值。
執(zhí)行結(jié)果:
2. 使用自定義類型來(lái)模擬對(duì)象
使用自定義數(shù)據(jù)類型的方式來(lái)自定義一個(gè)結(jié)構(gòu)體類型,這樣就可以達(dá)到定義一個(gè)對(duì)象的相同效果。
代碼示例:
代碼塊
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ? ?
"fmt"
- 5? ? ? ? ? ?
"reflect"
- 6?
)
- 7
- 8?
type Student struct {
- 9? ? ? ? ? ?
Name string
- 10? ? ? ? ?
Age int
- 11?
}
- 12
- 13?
func main() {
- 14? ? ? ? ?
var student1 Student
- 15? ? ? ? ?
student1.Name = "Codey"
- 16? ? ? ? ?
student1.Age = 18
- 17
- 18? ? ? ? ?
fmt.Println("student1數(shù)據(jù)類型:", reflect.TypeOf(student1))
- 19? ? ? ? ?
fmt.Println("student1的值:", reflect.ValueOf(student1))
- 20?
}
- 第 8~11 行:自定義一個(gè)結(jié)構(gòu)體數(shù)據(jù)類型 Student。也可以解讀為,創(chuàng)建一個(gè)"Student類";
- 第 14 行:聲明一個(gè) Student 類型的變量 student1。也可以解讀為,創(chuàng)建一個(gè)"Student對(duì)象"。
執(zhí)行結(jié)果:
3. 使用函數(shù)來(lái)模擬面向?qū)ο蟮姆椒?/span>
Go 語(yǔ)言中的函數(shù)為自定義數(shù)據(jù)類型提供了一種特別的使用方式,形如func(變量名 自定義數(shù)據(jù)類型)函數(shù)名(...){...}
。函數(shù)名前可以接收一個(gè)自定數(shù)據(jù)類型的參數(shù),參數(shù)傳遞的形式為自定義數(shù)據(jù)類型變量.函數(shù)名()
的形式傳遞,這樣外表看起來(lái)就和面向?qū)ο缶幊桃恢铝恕?/p>
代碼示例:
代碼塊
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ? ?
"fmt"
- 5?
)
- 6
- 7?
type Student struct {
- 8? ? ? ? ? ?
Name string
- 9? ? ? ? ? ?
Age int
- 10?
}
- 11
- 12?
func newStudent(name string, age int) Student {
- 13? ? ? ? ?
return Student{Name: name, Age: age}
- 14?
}
- 15?
func (s Student) PrintAge() {
- 16? ? ? ? ?
fmt.Println(s.Age)
- 17?
}
- 18?
func main() {
- 19? ? ? ? ?
student1 := newStudent("Codey", 18)
- 20? ? ? ? ?
student2 := newStudent("Tom", 19)
- 21? ? ? ? ?
fmt.Println("student1年齡:")
- 22? ? ? ? ?
student1.PrintAge()
- 23? ? ? ? ?
fmt.Println("student2年齡:")
- 24? ? ? ? ?
student2.PrintAge()
- 25?
}
- 第 15~17 行:打印傳入的 Student 自定義類型參數(shù) Age 屬性。也可以解讀為創(chuàng)建一個(gè)打印學(xué)生"對(duì)象"年齡的"方法";
- 第 22 行:使用自定義類型變量 student1 為參數(shù)調(diào)用 PrintAge。也可也解讀為 student1 "對(duì)象"調(diào)用PrintAge “方法”。
4. 小結(jié)
本文主要介紹了 Go 語(yǔ)言中另類的面向?qū)ο蟆o 語(yǔ)言中雖然沒(méi)有真正意義上的面向?qū)ο螅撬梢酝ㄟ^(guò)結(jié)構(gòu)體+自定義數(shù)據(jù)類型的方式對(duì)面向?qū)ο筮M(jìn)行模擬。所以可見(jiàn) Go 語(yǔ)言是一個(gè)非常靈活的語(yǔ)言,它的走向和創(chuàng)造力完全取決于開(kāi)發(fā)者的思維方式。
文章來(lái)源于網(wǎng)絡(luò),侵刪!
相關(guān)新聞
本文主要來(lái)講解一下 Go 語(yǔ)言的結(jié)構(gòu)體數(shù)據(jù)類型,以及 Go 語(yǔ)言中的"面向?qū)ο?,為什么要加雙引號(hào)呢?因?yàn)?Go 語(yǔ)言中沒(méi)有明確的面向?qū)ο蟮母拍睿?dāng)然也沒(méi)有明確的面向過(guò)程的概念。面向哪一方面編程完全取決于你如何使用,如果你想要面向?qū)ο缶幊蹋珿o 語(yǔ)言中提供了相對(duì)應(yīng)的解決方案來(lái)模擬面向?qū)ο蟆?/p>
1. 結(jié)構(gòu)體類型
想要模擬面向?qū)ο缶褪紫纫私庖幌?Go 語(yǔ)言中的結(jié)構(gòu)體類型。當(dāng)你需要兩個(gè)以上的基本數(shù)據(jù)類型或自定義類型來(lái)聲明定義函數(shù)的時(shí)候,你就可以使用結(jié)構(gòu)體。結(jié)構(gòu)體變量使用struct{...}
的形式來(lái)定義。
代碼示例:
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5? ? ? ? ?
"reflect"
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ? ?
var student1 struct {
- 10? ? ? ? ? ? ? ?
Name string
- 11? ? ? ? ? ? ? ?
Age int
- 12? ? ? ?
}
- 13? ? ? ?
student1.Name = "Codey"
- 14? ? ? ?
student1.Age = 18
- 15
- 16? ? ? ?
fmt.Println("student1數(shù)據(jù)類型:", reflect.TypeOf(student1))
- 17? ? ? ?
fmt.Println("student1的值:", reflect.ValueOf(student1))
- 18
- 19? ? ? ?
student2 := struct {
- 20? ? ? ? ? ? ? ?
Name string
- 21? ? ? ? ? ? ? ?
Age int
- 22? ? ? ?
}{
- 23? ? ? ? ? ? ? ?
Name: "Codey",
- 24? ? ? ? ? ? ? ?
Age: 18, //這個(gè)逗號(hào)千萬(wàn)不能忘記,若是和大括號(hào)同行,這個(gè)逗號(hào)才可以省略
- 25? ? ? ?
}
- 26
- 27? ? ? ?
fmt.Println("student2數(shù)據(jù)類型:", reflect.TypeOf(student2))
- 28? ? ? ?
fmt.Println("student2的值:", reflect.ValueOf(student2))
- 29?
}
- 第 9~12 行:聲明一個(gè)結(jié)構(gòu)體變量 student1,其屬性為 string 類型的 Name 和 int 類型的 Age。
- 第 13 行:給結(jié)構(gòu)體變量的 Name 屬性賦值。
- 第 14 行:給結(jié)構(gòu)體變量的 Age 屬性賦值。
- 第 19~25 行:定義一個(gè)結(jié)構(gòu)體變量 student2,其屬性為 string 類型的 Name 和 int 類型的 Age,并賦初值。
執(zhí)行結(jié)果:
2. 使用自定義類型來(lái)模擬對(duì)象
使用自定義數(shù)據(jù)類型的方式來(lái)自定義一個(gè)結(jié)構(gòu)體類型,這樣就可以達(dá)到定義一個(gè)對(duì)象的相同效果。
代碼示例:
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ? ?
"fmt"
- 5? ? ? ? ? ?
"reflect"
- 6?
)
- 7
- 8?
type Student struct {
- 9? ? ? ? ? ?
Name string
- 10? ? ? ? ?
Age int
- 11?
}
- 12
- 13?
func main() {
- 14? ? ? ? ?
var student1 Student
- 15? ? ? ? ?
student1.Name = "Codey"
- 16? ? ? ? ?
student1.Age = 18
- 17
- 18? ? ? ? ?
fmt.Println("student1數(shù)據(jù)類型:", reflect.TypeOf(student1))
- 19? ? ? ? ?
fmt.Println("student1的值:", reflect.ValueOf(student1))
- 20?
}
- 第 8~11 行:自定義一個(gè)結(jié)構(gòu)體數(shù)據(jù)類型 Student。也可以解讀為,創(chuàng)建一個(gè)"Student類";
- 第 14 行:聲明一個(gè) Student 類型的變量 student1。也可以解讀為,創(chuàng)建一個(gè)"Student對(duì)象"。
執(zhí)行結(jié)果:
3. 使用函數(shù)來(lái)模擬面向?qū)ο蟮姆椒?/span>
Go 語(yǔ)言中的函數(shù)為自定義數(shù)據(jù)類型提供了一種特別的使用方式,形如func(變量名 自定義數(shù)據(jù)類型)函數(shù)名(...){...}
。函數(shù)名前可以接收一個(gè)自定數(shù)據(jù)類型的參數(shù),參數(shù)傳遞的形式為自定義數(shù)據(jù)類型變量.函數(shù)名()
的形式傳遞,這樣外表看起來(lái)就和面向?qū)ο缶幊桃恢铝恕?/p>
代碼示例:
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ? ?
"fmt"
- 5?
)
- 6
- 7?
type Student struct {
- 8? ? ? ? ? ?
Name string
- 9? ? ? ? ? ?
Age int
- 10?
}
- 11
- 12?
func newStudent(name string, age int) Student {
- 13? ? ? ? ?
return Student{Name: name, Age: age}
- 14?
}
- 15?
func (s Student) PrintAge() {
- 16? ? ? ? ?
fmt.Println(s.Age)
- 17?
}
- 18?
func main() {
- 19? ? ? ? ?
student1 := newStudent("Codey", 18)
- 20? ? ? ? ?
student2 := newStudent("Tom", 19)
- 21? ? ? ? ?
fmt.Println("student1年齡:")
- 22? ? ? ? ?
student1.PrintAge()
- 23? ? ? ? ?
fmt.Println("student2年齡:")
- 24? ? ? ? ?
student2.PrintAge()
- 25?
}
- 第 15~17 行:打印傳入的 Student 自定義類型參數(shù) Age 屬性。也可以解讀為創(chuàng)建一個(gè)打印學(xué)生"對(duì)象"年齡的"方法";
- 第 22 行:使用自定義類型變量 student1 為參數(shù)調(diào)用 PrintAge。也可也解讀為 student1 "對(duì)象"調(diào)用PrintAge “方法”。
4. 小結(jié)
本文主要介紹了 Go 語(yǔ)言中另類的面向?qū)ο蟆o 語(yǔ)言中雖然沒(méi)有真正意義上的面向?qū)ο螅撬梢酝ㄟ^(guò)結(jié)構(gòu)體+自定義數(shù)據(jù)類型的方式對(duì)面向?qū)ο筮M(jìn)行模擬。所以可見(jiàn) Go 語(yǔ)言是一個(gè)非常靈活的語(yǔ)言,它的走向和創(chuàng)造力完全取決于開(kāi)發(fā)者的思維方式。
文章來(lái)源于網(wǎng)絡(luò),侵刪!