首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制指针值*a = *b在golang中

复制指针值*a = *b在golang中
EN

Stack Overflow用户
提问于 2014-01-09 03:14:49
回答 4查看 92.2K关注 0票数 64
代码语言:javascript
复制
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仍然是空的,我必须这样做

代码语言:javascript
复制
func Copy(a *T, b *T) error {
    b.Id = 5
    b.Name = "gert"
    a.Id = b.Id
    a.Name = b.Name
    return nil
}

现在ab是一样的

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-09 03:26:56

你的第一个例子几乎是正确的。传入指向两个对象的指针。您将这些指针放入变量A和B中,但是A和B是局部变量,所以当您说a=b时,您只是说“忘记A(本地)中的内容”。程序的其余部分仍然有指向这两个原始对象的指针。

如果要将B处的数据结构复制到A处的数据结构中,请执行以下操作:

代码语言:javascript
复制
*a = *b;

正如dmikalova在下面的评论中所指出的,这只是复制了结构--但没有结构指向的任何数据。如果您的结构有一个指针,它所指向的数据现在由两个副本共享(因为它只复制了指针)。

从技术上讲,字符串始终是指针,因此它们从不作为结构的一部分进行复制。但是,因为字符串是不可变的(并且Go有垃圾收集),字符串“感觉”它们是您的结构的一部分,您不必担心低级别的字符串共享会神奇地节省内存,而不必考虑它。

票数 98
EN

Stack Overflow用户

发布于 2015-10-14 08:50:37

框架开发人员的通用解决方案:

代码语言:javascript
复制
func Copy(source interface{}, destin interface{}) {
    x := reflect.ValueOf(source)
    if x.Kind() == reflect.Ptr {
        starX := x.Elem()
        y := reflect.New(starX.Type())
        starY := y.Elem()
        starY.Set(starX)
        reflect.ValueOf(destin).Elem().Set(y.Elem())
    } else {
        destin = x.Interface()
    }
}

所以:

代码语言:javascript
复制
Copy(old, new)

请参阅play.golang.org中的代码,因此您可以在运行时传递任何类型,只要您确信源和destin都是相同的类型(而destin是指向该类型的指针)。

票数 20
EN

Stack Overflow用户

发布于 2014-01-09 03:34:12

在go中,参数通过值传递。

T是一个指向T的指针,把它想象成一个int,它告诉你T在哪里。因此,"a“指向T的一个实例,b指向另一个实例。

在您的复制函数中,您是说要指向b的"T“(如果这有意义的话)。你想说的是,A的T应该和b的T一样

你可以通过取消指针来做到这一点。

所以,用*a = *b代替a=b(更改局部变量"a“指向任何"b”)(将a的T改为等于b的T)。

希望这是有意义的,下面是一个你的应用程序被修改为“做正确的事情”的例子。注意,您的复制函数在这里没有必要,它是为了说明。玩法

代码语言:javascript
复制
import "fmt"

type T struct {
    Id   int
    Name string
}

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

func main() {
    var a = &T{1, "one"}
    var b = &T{2, "two"}

    fmt.Println(a, b)
    Copy(a, b)
    fmt.Println(a, b)
    CopyThatActuallyCopies(a, b)
    fmt.Println(a, b)
}
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21011023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档