Pointers 为什么在goroutine中替换此golang指针地址时不会更改?

Pointers 为什么在goroutine中替换此golang指针地址时不会更改?,pointers,go,Pointers,Go,我的理解是,当我用foo:=&bar{}创建一个对象时,我正在为该对象分配新内存。那么,为什么当我试图替换goroutine中的*foo时,它没有得到一个新的指针地址 主程序包 进口( “fmt” “数学/兰德” “同步” “时间” ) 类型指针对象结构{ objs*对象 } 类型对象结构{ sliceOfObject[]*对象 } 类型对象结构{ 整数 布尔布尔布尔 } func main(){ p:=&指针对象{objs:newObjects()} mu:=&sync.Mutex{} 对于u

我的理解是,当我用
foo:=&bar{}
创建一个对象时,我正在为该对象分配新内存。那么,为什么当我试图替换goroutine中的*foo时,它没有得到一个新的指针地址

主程序包
进口(
“fmt”
“数学/兰德”
“同步”
“时间”
)
类型指针对象结构{
objs*对象
}
类型对象结构{
sliceOfObject[]*对象
}
类型对象结构{
整数
布尔布尔布尔
}
func main(){
p:=&指针对象{objs:newObjects()}
mu:=&sync.Mutex{}
对于u,o:=范围p.objs.sliceOfObject{
o、 setBool(真)
}
//goroutine 1
go func(){
股票代码:=time.NewTicker(time.Second)
延迟停止
适用于range ticker.C{
木锁()
fmt.Printf(“对象指针:%v\n”,&p.objs)
对于i,o:=范围p.objs.sliceOfObject{
fmt.Printf(“i:%d p:%v n:%d b:%t\n”,i,&o,o.number,o.boolean)
}
格式打印(“--\n”)
mu.Unlock()
}
}()
//戈罗廷2
go func(){
ticker:=time.NewTicker(time.Second*2)
延迟停止
适用于range ticker.C{
newObjects:=&objects{sliceOfObject:newSliceOfObject()}
木锁()
p、 objs=newObjects
mu.Unlock()

fmt.Printf(“已替换:%v除打印输出外,程序按预期工作

要打印变量的值,请使用fmt.Printf参数列表中的变量。不要传递变量的地址。变量的值和变量的地址是不同的

要最佳查看指针,请使用
%p
动词而不是
%v
打印指针

这里有一个例子,改变

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

fmt.Printf(“替换:%v程序有数据竞争。运行并修复报告的问题。
*p.objs=*newObjects
更改
p.objs
所指的值。这为什么会更改
p.objs
的地址?重要的更改是在打印调用中将
&p.objs
替换为
p.objs
。打印f.objs的地址字段与打印字段的值不同。将
%v
更改为
%p
可确保将值打印为指针。@AaronSmall-旁注,您说过“存在竞争,但不会影响结果”,并提供“证据”事实上,在您修复它之后,结果是不变的。好吧,这不是它真正的工作方式。根据定义,数据竞争使程序的行为未定义。它可能会导致“您期望的”;但在存在数据竞争的情况下,编译器不能保证结果的任何内容。请查看本文(不是去,而是同样的事情):@AaronSmall在提问之前先修复已知的数据竞赛,以防数据竞赛导致意外结果。这是一个错误,但这个错误不像数据竞赛那么容易发现(至少对我来说)。
objects pointer: 0xc00000e030
i: 0 p: 0xc00009a010 n: 5577006791947779410 b: true
i: 1 p: 0xc00009a010 n: 8674665223082153551 b: true
i: 2 p: 0xc00009a010 n: 6129484611666145821 b: true
---
replaced: 0xc00000e030 <-- 0xc00000e040 
objects pointer: 0xc00000e040
i: 0 p: 0xc00000e050 n: 4037200794235010051 b: false
i: 1 p: 0xc00000e050 n: 3916589616287113937 b: false
i: 2 p: 0xc00000e050 n: 6334824724549167320 b: false
        fmt.Printf("replaced: %v <-- %v \n", &p.objs, &newObjects)
        fmt.Printf("replaced: %p <-- %p \n", p.objs, newObjects)