当前位置:  首页>> 技术小册>> GO面试指南

在 Go 语言中,赋值操作和传参操作都是默认进行浅拷贝的。浅拷贝会使得目标对象和源对象共享同一块内存空间,如果对目标对象进行修改,会影响到源对象。而深拷贝则会复制一份全新的数据结构,使得目标对象和源对象互相独立,修改目标对象不会影响到源对象。

下面是一个使用浅拷贝的示例:

  1. type Person struct {
  2. Name string
  3. Age int
  4. }
  5. func main() {
  6. p1 := Person{Name: "Alice", Age: 18}
  7. p2 := p1
  8. p2.Age = 20
  9. fmt.Println(p1) // 输出 {Alice 20}
  10. }

在上面的示例中,我们定义了一个 Person 结构体,并创建了一个 p1 变量来保存一个 Person 对象。然后,我们将 p1 赋值给 p2 变量,这个赋值操作是浅拷贝。接着,我们修改了 p2 的 Age 属性为 20,然后输出了 p1,发现 Age 属性也被修改了,这说明 p1 和 p2 共享同一块内存空间。

下面是一个使用深拷贝的示例:

  1. type Person struct {
  2. Name string
  3. Age int
  4. }
  5. func (p Person) Clone() Person {
  6. return Person{Name: p.Name, Age: p.Age}
  7. }
  8. func main() {
  9. p1 := Person{Name: "Alice", Age: 18}
  10. p2 := p1.Clone()
  11. p2.Age = 20
  12. fmt.Println(p1) // 输出 {Alice 18}
  13. }

在上面的示例中,我们给 Person 结构体添加了一个 Clone 方法,用于返回一个全新的 Person 对象,这个操作是深拷贝。然后,我们创建了一个 p1 变量来保存一个 Person 对象,接着,我们调用 p1 的 Clone 方法,将返回的新对象赋值给 p2 变量。然后,我们修改了 p2 的 Age 属性为 20,然后输出了 p1,发现 Age 属性没有被修改,这说明 p1 和 p2 互相独立,修改 p2 不会影响到 p1。

Go 语言中赋值操作和传参操作都是默认进行浅拷贝的,如果需要进行深拷贝,可以手动编写相应的函数来实现。


该分类下的相关小册推荐: