Go語言方法值和方法表示式
阿新 • • 發佈:2020-12-19
遇到一個案例:
type MyInt int
func (n MyInt) test() {
fmt.Println(n)
}
func main() {
var n MyInt = 10
fmt.Println(n)
n++
f1 := MyInt.test
f1(n)
n++
f2 := (*MyInt).test
f2(&n)
}
咱們先來分析一下:
1.定義了一個自定義型別MyInt型別為Int
2.MyInt型別有一個方法為test()
3.呼叫過程: 首先給自定義型別賦值,然後列印,之後在自增,然後到f1這塊,瞬間就有點懵逼了,怎麼還可以這麼搞?沒見過呀。這個不應該是n.test()麼,怎麼是這種的,然後我列印了一下f1的型別,發現f1的型別是 func(main.MyInt),但是之前確實沒見過這種型別的呼叫方式,那這塊也就是說f1是個函式型別,那既然是函式型別的話,那就好說了,其實對於一個型別而言,屬於這個型別的方法,都可以這麼搞。f1是個函式,那就自己呼叫唄。不過還是有點懵逼。
後來查看了文件之後才發現這是方法值和方法表示式問題,我們通常使用的是直接呼叫得方式
而上面這一種是方法表示式的方式,也就是先宣告呼叫的方式,然後再呼叫,也就是Type.方法名的方式,然後再通過生成的函式變數去呼叫具體的方法。當然這塊就需要將呼叫方當做引數傳遞給函式,但是實際上該函式在定義的時候是沒有引數的,這也就是自己懵逼的地方。
其實還有一種方式,就是方法值的方式:
type MyInt int
func (n MyInt) test() {
fmt.Println(n)
}
func main() {
var n MyInt = 10
fmt.Println(n)
n++
f1 := n.test
f1()
}
通過變數宣告方法然後通過宣告的函式變數呼叫方法
總結:
1.方法表示式:通過型別指標或者型別先宣告需要呼叫的函式,返回一個函式型別的變數,然後將具體型別的變數當做引數傳遞給具體需要呼叫的方法
2.值表示式:通過當前型別具體的值宣告需要呼叫的函式,返回一個函式型別的變數,然後通過該函式變數去呼叫具體的方法。