golang浅拷贝

93 阅读1分钟

浅拷贝只会拷贝基础类型,如int之类的。而指针类对象,切片不会重新拷贝,而只是拷贝一份指针。

import "fmt"

type Hello struct {
	A int
	greet *Message
	C []int
}
type Message struct {
	Content string
}

func (h Hello)printHello() {
	fmt.Print("A=",h.A,",message=",h.greet.Content,",C=",h.C)
	fmt.Println()
}

func main() {

	registries:=Hello{
		A: 1,
		greet: &Message{
			Content: "hello world",
		},
		C: []int{1,2,3},
	}
        // 执行浅拷贝(shallow copy)
	back:=registries

	back.A=2
	back.greet.Content="change it"
	back.C[0]=5
	registries.printHello()
	back.printHello()
}



输出结果:

A=1,message=change it,C=[5 2 3]
A=2,message=change it,C=[5 2 3]

对象直接量

那么对象直接量呢? greet *Message换成了greet Message

package main

import "fmt"

type Hello struct {
	A int
	greet Message  // 对象直接量
	C []int
}
type Message struct {
	Content string
}

func (h Hello)printHello() {
	fmt.Print("A=",h.A,",message=",h.greet.Content,",C=",h.C)
	fmt.Println()
}

func main() {

	registries:=Hello{
		A: 1,
		greet: Message{
			Content: "hello world",
		},
		C: []int{1,2,3},
	}
	back:=registries

	back.A=2
	back.greet.Content="change it"
	back.C[0]=5
	registries.printHello()
	back.printHello()
}

输出结果为:

A=1,message=hello world,C=[5 2 3]  
A=2,message=change it,C=[5 2 3]  // 可见对象直接量也会拷贝,而对象指针不会拷贝