我的理解是,當(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但沒有成功。
為什么這個(gè)golang指針地址在goroutine中替換時(shí)不會(huì)改變?
慕無忌1623718
2022-06-06 16:49:26