原型模式(Prototype Design Pattern)
原型模式用于创建当前对象的克隆:通过拷贝当前对象创建新的对象。原型模式一般用于创建复杂的实例,这样使用其它更简洁高效。
package prototype
type Job struct {
Company string
}
type Person struct {
Name string
Age int
Job *Job
}
// 浅拷贝
func (p *Person) Clone() *Person {
ret := new(Person)
*ret = *p
return ret
}
调用:
person := Person{Name: "zhangsan", Age: 18, Job: &Job{Company: "JD"}}
person2 := person.Clone()
person.Name = "lisi"
person.Job.Company = "Tencent"
fmt.Printf("%p, %+v, job=%s\n", &person, person, person.Job.Company)
fmt.Printf("%p, %+v, job=%s\n", person2, *person2, person2.Job.Company)
// Output:
// 0xc0000da040, {Name:lisi Age:18 Job:0xc000096520}, job=Tencent
// 0xc0000da060, {Name:zhangsan Age:18 Job:0xc000096520}, job=Tencent
可以看到这种方式对指针类型是浅拷贝的,对于Job指针还是指向了相同的地址, 此外interface、slice、map、chan类型也是浅拷贝,只是拷贝指向的地址,针对这种复杂情况就要自己实现深拷贝。