📜  如何在 Golang 中使用值和指针引用复制结构类型?(1)

📅  最后修改于: 2023-12-03 15:38:16.051000             🧑  作者: Mango

如何在 Golang 中使用值和指针引用复制结构类型?

在Golang中,结构体是一个非常常用的数据类型。在很多代码中,我们需要使用结构体来存储程序中的一些数据,而在复制和引用结构体时,我们需要考虑一些重要的细节。本文将介绍如何在Golang中使用值和指针引用复制结构类型。

使用值传递结构体

当我们使用值类型来传递结构体时,Go语言会对结构体进行一次复制操作,即将结构体的内容复制到一个新的结构体中。因此,当我们修改新结构体时,原始结构体不会受到影响。下面是一个示例代码,其中我们创建了一个名为“person”的结构体,该结构体具有名字和年龄字段。我们创建了两个不同的结构体变量,并在一个函数中分别对它们进行修改。

type person struct {
    name string
    age  int
}

func main() {
    p1 := person{"Alice", 20}
    p2 := p1 // 复制一个结构体
    p2.name = "Bob" // 修改 p2 的名字字段
    fmt.Println(p1.name) // 输出 "Alice"
    fmt.Println(p2.name) // 输出 "Bob"
}

上面的代码演示了如何使用值类型来传递结构体。我们首先创建了一个名为“p1”的结构体,并将其传递给“p2”变量。然后我们修改了“p2”的名字字段,并打印了两个变量的值。由于Go语言复制了“p1”的内容而不是它的指针,因此“p1”的值没有被修改。

使用指针引用结构体

如果我们想要修改原始结构体的值,我们需要使用指向结构体的指针。在这种情况下,我们可以通过修改指针指向的内容来更改原始结构体的值。下面是一个示例代码,其中我们创建了一个名为“p”的结构体,并使用“&p”获取指向结构体的指针。我们将传递该指针到一个函数中,并在函数中修改原始结构体的值。

func modify(p *person) {
    p.name = "Charlie"
    p.age = 30
}

func main() {
    p := person{"Alice", 20}
    modify(&p)
    fmt.Println(p.name) // 输出 "Charlie"
}

在上面的示例中,我们创建了一个名为“modify”的函数,它接受一个指向“person”结构体的指针。我们在该函数中修改了结构体的字段的值,并在主函数中调用了该函数来修改原始结构体的值。由于我们使用了指向结构体的指针,因此我们可以直接修改原始结构体的值。

总结

在本文中,我们讨论了如何在Golang中使用值和指针引用复制结构体类型。当我们使用值类型传递结构体时,Go语言会复制结构体的内容并将其存储在新的结构体中。但是,当我们使用指向结构体的指针时,我们可以直接修改原始结构体的值。如果您需要在程序中复制或引用结构体,请根据您的需求选择适当的方法。