go 物件導向

2021-08-28 17:39:57 字數 3319 閱讀 8383

在前面博文我們有記錄函式與struct型別的使用,那你是否有想過把函式當做struct字段一樣來處理呢?接下來,將記錄一下函式的另一種形態,帶有接收者的函式,我們稱之為method,即方法

在物件導向程式設計中,乙個物件其實也就是乙個簡單的值或者乙個變數,在這個物件中會包含一些函式,這種帶有接收者的函式,我們稱之為方法!本質上,乙個方法就是乙個和特殊型別關聯的函式。

method的語法如下:

func (r receivertype) funcname(parameters) (results)
另外使用方法有以下幾點值得注意:

type long *ing

func (a long) add()

下面,我們舉乙個簡單的栗子:

package main

import "fmt"

type long int

func (a long) add(b long) long

func main()

// 列印結果如下

30

下面,我們用struct型別來定義在其他語言中最為常見的getset方法,如下:

package main

type student struct

func (s student) get_info() (name string, age)

func (s *student) set_info(name string, age int)

func main()

觀察方法得知,get方法繫結的為student的普通變數,set方法繫結的為student的指標變數。我們可以在main方法中這樣使用它們:

var s student

(&s).set_info("laozhang", 18)

name, age := s.get_info()

fmt.println(name, age)

// 列印結果如下

laozhang 18

其實,在go中內部已經為我們做好了處理,我們無需在使用&或者*號來進行使用它們,如下:

// 操作1

var s student

s.set_info("laozhang", 18)

name, age := s.get_info()

// 操作2

s := new(student)

s.set_info("laozhang", 18)

name, age := s.get_info

go內部已經為我們做好了相應的處理,所以上面兩種操作都可以達到我們的目的!!

你也許會想,這會不會是結構體的特性,基本型別就不可以了呢?基本型別也是一樣的,下面我們舉個栗子來進行驗證一下:

package main

import "fmt"

type long int

func (a *long) set(info long)

func (a long) add(b long) long

func main()

我們來執行一下程式,並列印result的值,發現結果一樣的!

package main

import "fmt"

type people struct

func (p people) get_person_info() (name string, age)

type student struct

func main(), 98}

name, age := s.get_person_info()

fmt.println(name, age)

}// 列印結果如下

laozhang 20

從**中可以看到,在student中並沒有實現get_person_info方法,之所以能夠呼叫get_person_info方法,是因為student中包含了people匿名字段,並且people中含有get_person_info方法

在go中,也可以實現重寫。在乙個struct型別中實現乙個與匿名字段實現的方法同名的方法,那麼這個方法就叫做重寫方法,如下:

package main

import "fmt"

type people struct

func (p people) print_info()

type student struct

func (s student) print_info()

func main(), 98}

s.print_info()

}// 列印結果如下

這是student的print_info

從列印結果可以看出,呼叫了這樣的重名方法會遵循乙個就近原則,即會在當前結構體中尋找,如果找到了即呼叫,未找到就會往匿名欄位中進行尋找!

但是,如果我想使用的匿名欄位的方法時,那麼,我們可以這樣:

s := student, 98}

s.people.print_info()

如此,就會使用的是匿名欄位people中的方法了!

假設有這樣乙個栗子:

package main

import "fmt"

type people struct

func (p people) print_info()

func main()

方法值寫法:

p := people

f := p.print_info

f()

方法表示式寫法:

// 操作1

p := people

f := (people).print_info

f(p)

// 操作2

p := people

f := (*people).print_info

f(&p)

方法表示式中這兩中寫法實現的效果是一樣的!

至此,over~~~~

go物件導向

把一類事物的共有的屬性 字段 和行為 方法 提取出來,形成乙個物理模型 結構體 這種研究問題的方法稱為抽象 封裝 encapsulation 就是把抽象出的字段和對字段的操作封裝在一起,資料被保護在內部,程式的其它包只有通過被授權的操作 方法 才能對欄位進行操作 封裝的好處 1 隱藏實現細節 2 可...

go語言物件導向

go語言可通過struct宣告新的型別 新建乙個型別person type person struct var p1 person p1.name liming p1.age 18新建乙個型別student,可以通過匿名欄位將person所有欄位隱式引入student type student st...

Go 物件導向程式設計

值語義與引用語義的區別在於賦值。值型別不會改變變數值,引用型別會改變變數值。go 語言中大多數型別都是基於值語義,包括 基本型別 如byte int bool float32 float64和string 復合型別 如陣列 array 結構體 struct 和指標 pointer 等。go語言中的陣...