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

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

為什么這個(gè)golang指針地址在goroutine中替換時(shí)不會(huì)改變?

為什么這個(gè)golang指針地址在goroutine中替換時(shí)不會(huì)改變?

Go
慕無忌1623718 2022-06-06 16:49:26
我的理解是,當(dāng)我創(chuàng)建一個(gè)對(duì)象時(shí),foo := &bar{}我正在為該對(duì)象分配新內(nèi)存。那么,當(dāng)我嘗試在 goroutine 中替換 *foo 時(shí),為什么它沒有獲得新的指針地址?package mainimport (    "fmt"    "math/rand"    "sync"    "time")type pointerToObjects struct {    objs *objects}type objects struct {    sliceOfObject []*object}type object struct {    number  int    boolean bool}func main() {    p := &pointerToObjects{objs: newObjects()}    mu := &sync.Mutex{}    for _, o := range p.objs.sliceOfObject {        o.setBool(true)    }    // goroutine 1    go func() {        ticker := time.NewTicker(time.Second)        defer ticker.Stop()        for range ticker.C {            mu.Lock()            fmt.Printf("objects pointer: %v\n", &p.objs)            for i, o := range p.objs.sliceOfObject {                fmt.Printf("i: %d p: %v n: %d b: %t\n", i, &o, o.number, o.boolean)            }            fmt.Print("---\n")            mu.Unlock()        }    }()    // goroutine 2    go func() {        ticker := time.NewTicker(time.Second * 2)        defer ticker.Stop()        for range ticker.C {            newObjects := &objects{sliceOfObject: newSliceOfObject()}            mu.Lock()            p.objs = newObjects            mu.Unlock()            fmt.Printf("replaced: %v <-- %v \n", &p.objs, &newObjects)        }    }()    // let the goroutines run for 10 seconds    time.Sleep(time.Second * 10)}func newObjects() *objects {    objs := &objects{}    objs.sliceOfObject = newSliceOfObject()    return objs}func newSliceOfObject() []*object {    var sliceObjs []*object    for i := 0; i < 3; i++ {        sliceObjs = append(sliceObjs, newObject())    }    return sliceObjs}func newObject() *object {    return &object{number: rand.Int()}}func (obj *object) setBool(b bool) {    obj.boolean = b}運(yùn)行時(shí),值會(huì)按我的預(yù)期更新,但指向的指針p保持objects不變。我希望它會(huì)在我打電話時(shí)更新*p.objs = *newObjects這是編譯器的把戲嗎?如何獲取“對(duì)象指針”以更新到新位置?我需要使用更明確的指針嗎?編輯:修復(fù)了比賽條件并嘗試分配p.objs = newObjects但沒有成功。
查看完整描述

1 回答

?
哆啦的時(shí)光機(jī)

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

除打印輸出外,該程序按您預(yù)期的方式工作。

要打印變量的值,請(qǐng)使用 fmt.Printf 參數(shù)列表中的變量。不要傳遞變量的地址。變量的值和變量的地址是不同的東西。

為了更好地查看指針,請(qǐng)使用%p動(dòng)詞而不是. 打印指針%v。

這是一個(gè)例子。改變

        fmt.Printf("replaced: %v <-- %v \n", &p.objs, &newObjects)

        fmt.Printf("replaced: %p <-- %p \n", p.objs, newObjects)

標(biāo)題中提到的與使用 goroutine 無關(guān)的問題。


查看完整回答
反對(duì) 回復(fù) 2022-06-06
  • 1 回答
  • 0 關(guān)注
  • 135 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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