在 Go 语言中,赋值操作和传参操作都是默认进行浅拷贝的。浅拷贝会使得目标对象和源对象共享同一块内存空间,如果对目标对象进行修改,会影响到源对象。而深拷贝则会复制一份全新的数据结构,使得目标对象和源对象互相独立,修改目标对象不会影响到源对象。
下面是一个使用浅拷贝的示例:
type Person struct {
Name string
Age int
}
func main() {
p1 := Person{Name: "Alice", Age: 18}
p2 := p1
p2.Age = 20
fmt.Println(p1) // 输出 {Alice 20}
}
在上面的示例中,我们定义了一个 Person 结构体,并创建了一个 p1 变量来保存一个 Person 对象。然后,我们将 p1 赋值给 p2 变量,这个赋值操作是浅拷贝。接着,我们修改了 p2 的 Age 属性为 20,然后输出了 p1,发现 Age 属性也被修改了,这说明 p1 和 p2 共享同一块内存空间。
下面是一个使用深拷贝的示例:
type Person struct {
Name string
Age int
}
func (p Person) Clone() Person {
return Person{Name: p.Name, Age: p.Age}
}
func main() {
p1 := Person{Name: "Alice", Age: 18}
p2 := p1.Clone()
p2.Age = 20
fmt.Println(p1) // 输出 {Alice 18}
}
在上面的示例中,我们给 Person 结构体添加了一个 Clone 方法,用于返回一个全新的 Person 对象,这个操作是深拷贝。然后,我们创建了一个 p1 变量来保存一个 Person 对象,接着,我们调用 p1 的 Clone 方法,将返回的新对象赋值给 p2 变量。然后,我们修改了 p2 的 Age 属性为 20,然后输出了 p1,发现 Age 属性没有被修改,这说明 p1 和 p2 互相独立,修改 p2 不会影响到 p1。
Go 语言中赋值操作和传参操作都是默认进行浅拷贝的,如果需要进行深拷贝,可以手动编写相应的函数来实现。