type T struct {
    Id int
    Name string
}

func Copy(a *T, b *T) error {
    b.Id=5
    b.Name="gert"
    a = b
    return nil
}

a还是空的,我得这样做

func Copy(a *T, b *T) error {
    b.Id = 5
    b.Name = "gert"
    a.Id = b.Id
    a.Name = b.Name
    return nil
}

现在a等于b

为什么以及如何直接将*b复制到*a

推荐答案

您的第一个示例几乎是正确的.您传入指向两个对象的指针.您将这些指针放入变量A和B中.但是A和B是局部变量,所以当您说a=b时,您只是在说"(局部)忘记A中的内容".程序的睡觉仍然有指向这两个原始对象的指针.

如果要将B处的data structure复制到A处的data structure,请改为执行以下操作:

*a = *b;

正如dmikalova在下面的注释中指出的那样,这只是复制 struct ,而不是 struct 指向的任何数据.如果您的 struct 有一个指针,那么它所指向的数据现在由两个副本共享(因为它只复制了指针).

从技术上讲,字符串始终是指针,因此它们永远不会作为 struct 的一部分进行复制.But因为字符串是不可变的(并且Go具有垃圾收集),所以字符串"感觉"就像是您的 struct 的一部分,您不必担心低级字符串共享会神奇地节省您的内存,而您不必考虑它.

Go相关问答推荐

将Go程序导出到WASM—构建约束排除所有Go文件

如何在使用中介资源时处理函数中的`defer`

如何使用Promela建模语言对Golang RWLock进行建模

为什么Slices包中的函数定义Slice参数的类型参数?

如何使用gopher-lua定义一个Lua函数,该函数有一个预定义的表作为param,Lua脚本可以在其中访问该函数中的表?

为什么 mux.Vars() 返回空的 map[]

Golang校验器包:重命名字段错误处理

Golang 到 wasm 编译使用 tinygo.使用 wasmtime 执行

如何使用 go 包设置标头键和值:shurcooL/graphql 或 hasura/go-graphql-client?

具有两个参数的动态规划:天数和优惠券

致命错误 - 所有 Goroutines 都睡着了!僵局

动态 SQL 集 Golang

接受通道和切片的通用函数

使用 image/jpeg 编码导致图像饱和/错误像素

将未知长度切片的值分配给Go中的 struct ?

从另一个没有重复的确定性 int

go mod tidy 错误消息:但是 go 1.16 会 Select

正则表达式处理数字签名的多个条目

Go 赋值涉及到自定义类型的指针

有没有办法在golang中映射一组对象?