清華尹成帶你實戰GO案例(28)Go 方法
Go 方法
一般的函式定義叫做函式,定義在結構體上面的函式叫做該結構體的方法。
示例1:
輸出結果為
area: 50
perim: 30
area: 50
perim: 30
示例2:
從某種意義上說,方法是函式的“語法糖”。當函式與某個特定的型別繫結,那麼它就是一個方法。也證
因為如此,我們可以將方法“還原”成函式。
instance.method(args)->(type).func(instance,args)
為了區別這兩種方式,官方文件中將左邊的稱為 Method Value ,右邊則是 Method Expression 。
Method Value是包裝後的狀態物件,總是與特定的物件例項關聯在一起(類似閉包,拐帶私奔),而
Method Expression函式將Receiver作為第一個顯式引數,呼叫時需額外傳遞。
注意:對於Method Expression,T僅擁有T Receiver方法, T擁有(T+ T)所有方法。
輸出結果:
Id: 2 Name 張三
x= 1
Id: 2 Name 張三
x= 2
Id: 2 Name 張三
x= 3
Id: 2 Name 張三
x= 4
示例3:
使用匿名欄位,實現模擬繼承。即可直接訪問匿名欄位(匿名型別或匿名指標型別)的方法這種行為類
似“繼承”。訪問匿名欄位方法時,有隱藏規則,這樣我們可以實現override效果。
輸出結果為:
一般的函式定義叫做函式,定義在結構體上面的函式叫做該結構體的方法。
示例1:
package main
import "fmt"
type rect struct {
width, height int
}
// 這個area方法有一個限定型別*rect,
// 表示這個函式是定義在rect結構體上的方法
func (r *rect) area() int {
return r.width * r.height
}
// 方法的定義限定型別可以為結構體型別
// 也可以是結構體指標型別
// 區別在於如果限定型別是結構體指標型別
// 那麼在該方法內部可以修改結構體成員資訊
func (r rect) perim() int {
return 2*r.width + 2*r.height
}
func main() {
r := rect{width: 10, height: 5}
// 呼叫方法
fmt.Println("area: ", r.area())
fmt.Println("perim:", r.perim())
// Go語言會自動識別方法呼叫的引數是結構體變數還是
// 結構體指標,如果你要修改結構體內部成員值,那麼使用
// 結構體指標作為函式限定型別,也就是說引數若是結構體
//變數,僅僅會發生值拷貝。
rp := &r
fmt.Println("area: ", rp.area())
fmt.Println("perim:", rp.perim())
}
輸出結果為
area: 50
perim: 30
area: 50
perim: 30
示例2:
從某種意義上說,方法是函式的“語法糖”。當函式與某個特定的型別繫結,那麼它就是一個方法。也證
因為如此,我們可以將方法“還原”成函式。
instance.method(args)->(type).func(instance,args)
為了區別這兩種方式,官方文件中將左邊的稱為 Method Value ,右邊則是 Method Expression 。
Method Value是包裝後的狀態物件,總是與特定的物件例項關聯在一起(類似閉包,拐帶私奔),而
Method Expression函式將Receiver作為第一個顯式引數,呼叫時需額外傳遞。
注意:對於Method Expression,T僅擁有T Receiver方法, T擁有(T+ T)所有方法。
package main
import (
"fmt"
)
func main() {
p := Person{2, "張三"}
p.test(1)
var f1 func(int) = p.test
f1(2)
Person.test(p, 3)
var f2 func(Person, int) = Person.test
f2(p, 4)
}
type Person struct {
Id int
Name string
}
func (this Person) test(x int) {
fmt.Println("Id:", this.Id, "Name", this.Name)
fmt.Println("x=", x)
}
輸出結果:
Id: 2 Name 張三
x= 1
Id: 2 Name 張三
x= 2
Id: 2 Name 張三
x= 3
Id: 2 Name 張三
x= 4
示例3:
使用匿名欄位,實現模擬繼承。即可直接訪問匿名欄位(匿名型別或匿名指標型別)的方法這種行為類
似“繼承”。訪問匿名欄位方法時,有隱藏規則,這樣我們可以實現override效果。
package main
import (
"fmt"
)
func main() {
p := Student{Person{2, "張三"}, 25}
p.test()
}
type Person struct {
Id int
Name string
}
type Student struct {
Person
Score int
}
func (this Person) test() {
fmt.Println("person test")
}
func (this Student) test() {
fmt.Println("student test")
}
輸出結果為:
student test
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
相關文章
- 清華尹成帶你實戰GO案例(22)Go常量Go
- 清華尹成帶你實戰GO案例(35)Go 互斥Go
- 清華尹成帶你實戰GO案例(38)Go 介面Go
- 清華尹成帶你實戰GO案例(46)Go 排序Go排序
- 清華尹成帶你實戰GO案例(47)Go 切片Go
- 清華尹成帶你實戰GO案例(2) Go 字典Go
- 清華尹成帶你實戰GO案例(7)Go DeferGo
- 清華尹成帶你實戰GO案例(7)Go ExitGo
- 清華尹成帶你實戰GO案例(12)Go PanicGo
- 清華尹成帶你實戰GO案例(19)Go變數Go變數
- 清華尹成帶你實戰GO案例(23)Go 超時Go
- 清華尹成帶你實戰GO案例(29)Go 工作池Go
- 清華尹成帶你實戰GO案例(37)Go 集合功能Go
- 清華尹成帶你實戰GO案例(49)Go 時間Go
- 清華尹成帶你實戰GO案例(52)Go數值Go
- 清華尹成帶你實戰GO案例(54)Go 陣列Go陣列
- 清華尹成帶你實戰GO案例(57)Go通道方向Go
- 清華尹成帶你實戰GO案例(63)Go 指標Go指標
- 清華尹成帶你實戰GO案例(8)Go for迴圈Go
- 清華尹成帶你實戰GO案例(17) Go URL解析Go
- 清華尹成帶你實戰GO案例(20)Go 遍歷通道Go
- 清華尹成帶你實戰GO案例(25)Go 打點器Go
- 清華尹成帶你實戰GO案例(30)Go 關閉通道Go
- 清華尹成帶你實戰GO案例(39)Go 結構體Go結構體
- 清華尹成帶你實戰GO案例(40)Go 程式觸發Go
- 清華尹成帶你實戰GO案例(41)Go 程式執行Go
- 清華尹成帶你實戰GO案例(50)Go 時間戳Go時間戳
- 清華尹成帶你實戰GO案例(53)Go 數字解析Go
- 清華尹成帶你實戰GO案例(55)Go 隨機數Go隨機
- 清華尹成帶你實戰GO案例(58)Go通道緩衝Go
- 清華尹成帶你實戰GO案例(5)Go 自定義排序Go排序
- 清華尹成帶你實戰GO案例(10)Go JSON支援GoJSON
- 清華尹成帶你實戰GO案例(11)Go Line FiltersGoFilter
- 清華尹成帶你實戰GO案例(13)Go range函式Go函式
- 清華尹成帶你實戰GO案例(16)Go Switch語句Go
- 清華尹成帶你實戰GO案例(21)Go 並行通道ChannelGo並行
- 清華尹成帶你實戰GO案例(24)Go 錯誤處理Go
- 清華尹成帶你實戰GO案例(26)Go 遞迴函式Go遞迴函式