第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在用作指針的結(jié)構(gòu)中嵌入結(jié)構(gòu)與指向結(jié)構(gòu)的指針

在用作指針的結(jié)構(gòu)中嵌入結(jié)構(gòu)與指向結(jié)構(gòu)的指針

Go
當(dāng)年話下 2023-07-10 10:49:13
如果我有一個(gè)A用作指針的結(jié)構(gòu)類型(僅具有指針接收器,構(gòu)造函數(shù)返回*A等),那么嵌入結(jié)構(gòu)類型與嵌入結(jié)構(gòu)類型有B什么B區(qū)別*B?也就是說(shuō),有什么區(qū)別type B struct {...}type A struct {    B    // ...}和type B struct {...}type A struct {    *B    // ...}例如,是否存在嵌入字段的復(fù)制?編輯:我還應(yīng)該提到嵌入式結(jié)構(gòu)B只有指針接收器。
查看完整描述

2 回答

?
收到一只叮咚

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊

兩種結(jié)構(gòu)的零值不同,這可能是一個(gè)顯著的人體工程學(xué)差異。


考慮嵌入類型


type B struct {

    X int

}


func (b *B) Print() { fmt.Printf("%d\n", b.X) }

如果我們直接將其嵌入為對(duì)象


type AObj struct {

    B

}

那么 type 的零值A(chǔ)Obj包括類型 的嵌入對(duì)象B,該對(duì)象也有其零值,因此我們可以安全地


var aObj AObj

aObj.Print() // prints 0

但如果我們嵌入一個(gè)指針


type APtr struct {

    *B

}

這個(gè)結(jié)構(gòu)體的零值有一個(gè) nil 指針值,我們不能真正直接使用它。


var aPtr APtr

aPtr.Print() // panics

對(duì)象有望以您期望的方式被復(fù)制。如果您創(chuàng)建一個(gè)新AObj對(duì)象,它將獲得嵌入的B.


aObj2 := aObj

aObj.X = 1

aObj2.Print() // prints 0, because it has a copy

如果創(chuàng)建一個(gè)新APtr對(duì)象,它會(huì)獲得 的副本*B,這意味著它共享底層的具體對(duì)象。


aPtr.B = &B{}

aPtr2 := aPtr

aPtr.X = 1

aPtr2.Print() // prints 1, because both objects point at the same B

可運(yùn)行示例位于https://play.golang.org/p/XmOgegwVFeE


查看完整回答
反對(duì) 回復(fù) 2023-07-10
?
滄海一幻覺(jué)

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊

考慮一個(gè)簡(jiǎn)單的示例程序。AstructAPtr嵌入一個(gè)指針,a直接structAVal嵌入一個(gè)結(jié)構(gòu)體:structB


package main


import "fmt"


type structB struct {

    foo int

}


type structAPtr struct {

    bar *structB

}


type structAVal struct {

    bar structB

}


func main() {

    // referencing bStruct

    b1 := structB{foo: 12}


    aPtr := structAPtr{bar: &b1}

    fmt.Println("Before assignment:")

    fmt.Printf("aPtr.bar.foo = %d, b.foo = %d\n", aPtr.bar.foo, b1.foo)


    aPtr.bar.foo = 42

    fmt.Println("After assignment:")

    fmt.Printf("aPtr.bar.foo = %d, b.foo = %d\n", aPtr.bar.foo, b1.foo)


    // copying bStruct

    b2 := structB{foo: 12}


    aVal := structAVal{bar: b2}

    fmt.Println("Before assignment:")

    fmt.Printf("aVal.bar.foo = %d, b.foo = %d\n", aVal.bar.foo, b2.foo)


    aVal.bar.foo = 42

    fmt.Println("After assignment:")

    fmt.Printf("aVal.bar.foo = %d, b.foo = %d\n", aVal.bar.foo, b2.foo)

}

intstructB.foo用于演示在orstructB內(nèi)部進(jìn)行操作時(shí)是否會(huì)發(fā)生變化。structAPtrstructAVal


該程序輸出:


Before assignment:

aPtr.bar.foo = 12, b.foo = 12

After assignment:

aPtr.bar.foo = 42, b.foo = 42 <------------ both changed

Before assignment:

aVal.bar.foo = 12, b.foo = 12

After assignment:

aVal.bar.foo = 42, b.foo = 12 <------------ only assignee changed

查看結(jié)果顯示:

  • 改變指針的值來(lái)structB改變structB

  • 更改復(fù)制版本structB的值不受影響(它仍然是,即使在被分配給之后)structAValstructB542aVal


編輯:

無(wú)論如何,如果您structB只有指針接收器,則預(yù)期的行為可能是更改structB更新strucA的兩個(gè)接收器。這是我的示例中的場(chǎng)景 1,并且肯定需要一個(gè)指針。來(lái)自圍棋之旅

具有指針接收器的方法可以修改接收器指向的值[...]。由于方法通常需要修改其接收器,因此指針接收器比值接收器更常見(jiàn)。


查看完整回答
反對(duì) 回復(fù) 2023-07-10
  • 2 回答
  • 0 關(guān)注
  • 266 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)