为什么将指针复制到Go结构时不保持与原始结构的链接?

为什么将指针复制到Go结构时不保持与原始结构的链接?,go,Go,我在玩go struct和struct pointer,最近有些事情让我困惑 所讨论的示例如下所示 我试过的 p1 := &Shirt{Price: 15.00,SKU: "empty"} t := *p1 t1 := &t 之后,我尝试更改t1的价格和SKU,希望它会更改p1的最终值 但我很惊讶t1的地址与p1不同,或者t1是p1(衬衫)的克隆(即t1) 我相信这在C()中是不一样的 那么Go内部如何处理与C等其他语言不同的问题呢?

我在玩go struct和struct pointer,最近有些事情让我困惑

所讨论的示例如下所示

我试过的

    p1 := &Shirt{Price: 15.00,SKU: "empty"}
    t := *p1
    t1 := &t
之后,我尝试更改t1的
价格
SKU
,希望它会更改p1的最终值

但我很惊讶t1的地址与p1不同,或者t1是p1(衬衫)的克隆(即t1)

我相信这在C()中是不一样的


那么Go内部如何处理与C等其他语言不同的问题呢?

在本例中,Go和C完全相同

这在C中是等价的

#include <stdio.h>

struct Shirt {
   int    Price;
   char*  Sku;
};

int main() {
    struct Shirt s1 = {
        Price: 15,
        Sku: "empty"
    };
    struct Shirt* s2 = &s1;
    struct Shirt  s3 = *s2;
    struct Shirt* s4 = &s3;
    
    printf("s1 address = %p, s3 address = %p\n", s2, s4);
    printf("s4.Price = %d, s4.Sku = %s\n", s4->Price, s4->Sku);
    
    return 0;
}
您将无法修改s1到s4

你本来会去的

package main

import (
    "fmt"
)

type Shirt struct {
    Price int
    SKU string
}

func main() {
    p1 := &Shirt{Price: 15.00,SKU: "empty"}
    t := *p1
    t1 := &t

    fmt.Printf("p1 address = %p, t1 address = %p\n", p1, t1)
    fmt.Printf("t1.Price = %v, t1.SKU = %v\n", t1.Price, t1.SKU)
}

它将输出

p1 address = 0xc0000ac040, t1 address = 0xc0000ac060
t1.Price = 15, t1.SKU = empty

因此,Go和C将以相同的方式处理这种情况。

没有什么不同<代码>t:=*p1使t成为衬衫,而不是指向衬衫的指针,因此它当然是断开连接的。如果要复制指针,而不是创建从指针目标复制的新对象,则需要在该行中省略
*
。因此,如果使用
memcpy(),这与在C中类似
在第二行中,将指针的目标复制到目标结构的位置。在链接的C程序中,您声称哪一行代码与Go中的
t:=*p1
行相同?请在你的问题中编辑尽可能短的复制者,并说出你认为相同的具体行。看一眼你的C程序,我看不到任何等价的代码。对于初学者来说,你的C示例非常难读懂。不要只相信我的话,当你完全忘记它的时候再来,试着读它来体验别人在读它时的体验。此外,它与您提供的Go示例不一致。当您执行此操作时,
struct Books*personPtr;结构书*personPtr2;personPtr=&Book1;personPtr2=&(*personPtr)您没有在堆栈上为新类型创建空间。您只是取消对指针的引用,然后获取它的地址。personPtr==personPtr2。或者,是史蒂文·埃克霍夫(Steven Eckhoff)在
personPtr2=&(*personPtr)
中所说的一个简短版本,
&
*
相互抵消,你刚刚完成了
personPtr2=personPtr
p1 address = 0xc0000ac040, t1 address = 0xc0000ac060
t1.Price = 15, t1.SKU = empty