方法集與表達(dá)式

Golang 表達(dá)式 :根據(jù)調(diào)用者不同,方法分為兩種表現(xiàn)形式:

instance.method(args...) ---> <type>.func(instance, args...)  

前者稱為 method value,后者 method expression。

兩者都可像普通函數(shù)那樣賦值和傳參,區(qū)別在于 method value 綁定實(shí)例,而 method expression 則須顯式傳參。

package main

import "fmt"

type User struct {
    id int
    name string
}

type Manager struct {
    User//通過組合實(shí)現(xiàn)繼承
    title string
}

func (u *User) ToString() string {
    return fmt.Sprintf("User: %p %v\n",u, u)
}

func (m *Manager) ToString() string  {
    return fmt.Sprintf("Manager: %p %v\n",m, m)
}

func (u *User) TestPointer() {
    fmt.Printf("TestPointer %p,%v\n",u, u)
}

func (u User) TestValue(){
    fmt.Printf("TestValue %p,%v\n",&u,u)
}

func main() {
    m := Manager{User{1,"Tom"},"Administrator"}
    fmt.Println(m.ToString())
    fmt.Println(m.User.ToString())
    fmt.Println("---------------------------------")
    u := User{1,"Tom"}
    u.TestValue()//u為{1,"Tom"}
    uValue := u.TestValue//uValue為當(dāng)前u的方法,復(fù)制了u的值
    u.id,u.name = 2,"cat"http://改變u的值
    u.TestValue()//u為改變的值
    uValue()//該方法為復(fù)制值的方法
    /* out
    TestValue 0xc0000040a8,{1 Tom}
    TestValue 0xc0000040d8,{2 cat}
    TestValue 0xc000004108,{1 Tom}
     */
    fmt.Println("---------------------------------")
    //總結(jié):方法中的對(duì)象為值的拷貝,還是地址的傳遞,與方法本身的聲明相關(guān)
    //與調(diào)用方法傳遞的類型無關(guān)
    //由于*T的方法包含了*T+T的方法所以可以調(diào)用
    u1 := User{1,"Tom"}
    fmt.Printf("u1 %p,%v\n",&u1,u1)
    mv := User.TestValue
    mv(u1)//由于方法有一個(gè)隱藏的this指針
    //mv中的u1是對(duì)主函數(shù)中u1的值拷貝,地址并不相同

    mp := (* User).TestPointer
    mp(&u1)//mp中的u1與主函數(shù)中u1是同一個(gè)內(nèi)存且地址相同

    mp2 := (* User).TestValue
    mp2(&u1)//mp2中的u1是對(duì)主函數(shù)中u1的值拷貝,地址并不相同


}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容