当前位置: 首页 > 面试题库 >

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

王凯旋
2023-03-14
问题内容
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
}

现在ab

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


问题答案:

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

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

*a = *b;

正如dmikalova在下面的注释中指出的那样,这仅复制结构-
而不复制该结构指向的任何数据。如果您的结构具有指针,则它指向的数据现在将被两个副本共享(因为它仅复制了指针)。

从技术上讲,字符串始终是指针,因此永远不会将其作为结构的一部分进行复制。 但是,
因为字符串是不可变的(并且Go具有垃圾回收功能),所以字符串“感觉”就像它们是您的结构的一部分,并且您不必担心低级字符串共享神奇地节省了内存,而无需考虑关于它。



 类似资料:
  • 问题内容: 我目前正在学习使用Go语言编程。我在理解Go指针时遇到了一些困难(并且我的C / C ++现在很遥远…)。例如,在“第52号游览”中(http://tour.golang.org/#52),我读到: 但是如果不是 我写: 甚至: 反之亦然: 我得到了完全相同的结果。有区别吗(在内存方面,等等)? 问题答案: 您的示例使用两种Go语言规则: 可以从具有值接收器的方法派生具有指针接收器的方

  • 和 C 语言一样,允许用一个变量来存放其它变量的地址,这种专门用于存储其它变量地址的变量,我们称之为指针变量 和 C 语言一样,Go 语言中的指针无论是什么类型占用内存都一样(32位4个字节,64位8个字节) package main import ( "fmt" "unsafe" ) func main() { var p1 *int; var p2 *floa

  • 与普通指针并无差异 package main import "fmt" func main() { var dict map[string]string = map[string]string{"name":"lnj", "age":"33"} var p *map[string]string = &dict (*p)["name"] = "zs" fmt.Println(di

  • 在 C 语言中,数组名,&数组名,&数组首元素保存的都是同一个地址 #include <stdio.h> int main(){ int arr[3] = {1, 3, 5}; printf("%p\n", arr); // 0060FEA4 printf("%p\n", &arr); // 0060FEA4 printf("%p\n", &a

  • 问题内容: 我的应用程序接受来自的指针。 例如 如何使用该指针并获取存储在该位置的值? 问题答案: 免责声明:您可能已经知道,这很危险,如果要在生产应用程序中执行此操作,则最好有一个很好的理由。话虽如此… 您需要做一些事情。这是代码,然后我们将逐步进行介绍。 您可以在Go Playground上运行它。 首先,我们需要将字符串解析为数值。在您的示例中,您给出了一个十六进制数,因此我们将以16为底进

  • 在C/C中,我们知道指针。也就是说,一个可变的内存地址。 比如,下面的代码不会编译,但其思想是: 地址的地址我们能走多远。“最终地址”在哪里?