原型模式(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类型也是浅拷贝,只是拷贝指向的地址,针对这种复杂情况就要自己实现深拷贝。

results matching ""

    No results matching ""