亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么這個golang指針地址在goroutine中替換時不會改變?

為什么這個golang指針地址在goroutine中替換時不會改變?

Go
慕無忌1623718 2022-06-06 16:49:26
我的理解是,當我創建一個對象時,foo := &bar{}我正在為該對象分配新內存。那么,當我嘗試在 goroutine 中替換 *foo 時,為什么它沒有獲得新的指針地址?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}運行時,值會按我的預期更新,但指向的指針p保持objects不變。我希望它會在我打電話時更新*p.objs = *newObjects這是編譯器的把戲嗎?如何獲取“對象指針”以更新到新位置?我需要使用更明確的指針嗎?編輯:修復了比賽條件并嘗試分配p.objs = newObjects但沒有成功。
查看完整描述

1 回答

?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

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

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

為了更好地查看指針,請使用%p動詞而不是. 打印指針%v

這是一個例子。改變

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

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

標題中提到的與使用 goroutine 無關的問題。


查看完整回答
反對 回復 2022-06-06
  • 1 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號