1. 程式人生 > >golang語法總結(二十一):方法method

golang語法總結(二十一):方法method

    Go不像其它面相物件語言一樣可以寫個class,然後在class裡面寫一堆方法,但是它也很巧妙的實現了這種效果,我們只需要在普通函式前面加個接受者(receiver,寫在函式名前面的括號裡面),這樣編譯器就知道這個函式(方法)屬於哪個struct了。
下面是簡單示例: 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 Integerintfunc (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是以大小寫來區分是公有還是私有,但都是針對包級別的,所以在包內所有的都能訪問,而方法繫結本身只能繫結包內的型別,所以方法可以訪問接收者所有成員。如果是包外呼叫某型別的方法,則需要看方法名是大寫還是小寫,大寫能被包外訪問,小寫只能被包內訪問。