golang語法總結(二十一):方法method
阿新 • • 發佈:2019-02-05
Go不像其它面相物件語言一樣可以寫個class,然後在class裡面寫一堆方法,但是它也很巧妙的實現了這種效果,我們只需要在普通函式前面加個接受者(receiver,寫在函式名前面的括號裡面),這樣編譯器就知道這個函式(方法)屬於哪個struct了。
下面是簡單示例:
其實有兩種呼叫方式,上面講的那種官方管它叫method value,還有另一種呼叫方式,叫method expression:
下面是簡單示例:
type A struct{
Namestring
}
func (a A)foo(){//接收者寫在函式名前面的括號裡面
fmt.Println("foo")
}
func main(){
a := A{}
a.foo()//foo
}
需要注意的是,因為Go不支援函式過載,所以某個接收者(receiver)的某個方法只能對應一個函式,比如下面的就屬於方法重複,編譯無法通過:
func (a A)foo(){
fmt.Println("foo")
}
func (a A)foo(i int){
fmt.Println(i)
}
這些可以叫做是方法繫結,接收者不僅可以是struct型別,還可以是任意自定義的其它型別,舉個栗子:
type Integerint
func (integer *Integer)talk(){
fmt.Println("i am ",*integer)
}
func main(){
var i Integer=250
i.talk()//i am 250
}
這下知道方法繫結是多麼的靈活了吧
注意方法繫結只能綁定當前包裡的型別其實有兩種呼叫方式,上面講的那種官方管它叫method value,還有另一種呼叫方式,叫method expression:
type Integerint
func (integer *Integer)talk(){
fmt.Println("i am ",*integer)
}
func main(){
var i Integer=250
(*Integer).talk(&i)//i am 250
}
最後說下訪問許可權,因為Go是以大小寫來區分是公有還是私有,但都是針對包級別的,所以在包內所有的都能訪問,而方法繫結本身只能繫結包內的型別,所以方法可以訪問接收者所有成員。如果是包外呼叫某型別的方法,則需要看方法名是大寫還是小寫,大寫能被包外訪問,小寫只能被包內訪問。