写时复制
package main
import "fmt"
type database struct {
data int // 原始数据
}
type snapshot struct {
data *int // 指向原始数据指针
}
var sna = &snapshot{}
func (d *database) createShot() *snapshot {
return &snapshot{data: &d.data} // 创建快照,只共享指针
}
func (d *database) clone() *snapshot {
s := d.data
return &snapshot{data: &s} // 复制新快照
}
func (d *database) set() {
sna = d.clone() // 触发写时复制,复制一份给快照
d.data = 1 // 修改原数据
}
func main() {
d := database{data: 2}
sna = d.createShot()
fmt.Println(*sna.data) // 2
d.set() // 写时复制:源数据修改,快照复制数据
fmt.Println(d.data) // 1
fmt.Println(*sna.data) // 2
}写时复制的三个黄金法则:
最后更新于