在Golang中,深拷贝和浅拷贝是指在复制数据结构时对其内部元素的处理方式。这两者之间的主要区别在于它们如何处理指针、引用类型或对象。

  1. 浅拷贝: 浅拷贝只复制数据结构的顶层元素。对于值类型(例如int、float、bool等),它们的值会被复制;而对于引用类型(例如指针、切片、映射、通道等),只有引用(即指针)会被复制,实际指向的数据不会被复制。因此,在浅拷贝后,原始数据结构和新数据结构中的引用类型将共享相同的内存空间。
  2. 深拷贝: 深拷贝会递归地复制数据结构的所有元素,包括指针和引用类型所指向的数据。这意味着,对于引用类型,深拷贝会创建一个新的副本,并将原始数据结构中的数据复制到新副本中。因此,在深拷贝后,原始数据结构和新数据结构将完全独立,互不影响。

下面是例子:

  1. 浅拷贝: 浅拷贝只复制数据结构的顶层元素。以下是一个浅拷贝示例:
package main

import (
	"fmt"
)

type Person struct {
	Name string
	Age  int
	Pets []string
}

func main() {
	original := Person{
		Name: "Alice",
		Age:  30,
		Pets: []string{"Dog", "Cat"},
	}
	copied := original // 浅拷贝

	copied.Name = "Bob"
	copied.Pets[0] = "Fish"

	fmt.Printf("Original: %+v\n", original)
	fmt.Printf("Copied: %+v\n", copied)
}

输出:

Original: {Name:Alice Age:30 Pets:[Fish Cat]}
Copied: {Name:Bob Age:30 Pets:[Fish Cat]}
copiedoriginal

2.深拷贝: 深拷贝会递归地复制数据结构的所有元素,包括指针和引用类型所指向的数据。以下是一个深拷贝示例:

package main

import (
	"fmt"
)

type Person struct {
	Name string
	Age  int
	Pets []string
}

func deepCopy(src Person) Person {
	copied := Person{
		Name: src.Name,
		Age:  src.Age,
		Pets: make([]string, len(src.Pets)),
	}
	copy(copied.Pets, src.Pets)
	return copied
}

func main() {
	original := Person{
		Name: "Alice",
		Age:  30,
		Pets: []string{"Dog", "Cat"},
	}
	copied := deepCopy(original) // 深拷贝

	copied.Name = "Bob"
	copied.Pets[0] = "Fish"

	fmt.Printf("Original: %+v\n", original)
	fmt.Printf("Copied: %+v\n", copied)
}

输出:

Original: {Name:Alice Age:30 Pets:[Dog Cat]}
Copied: {Name:Bob Age:30 Pets:[Fish Cat]}
deepCopyPersoncopiedoriginal