# Packages
No description provided by the author
# Structs
Once 是 sync.Once 的扩展实现,由于每次使用 sync.Once 都需要保存两个字段,一个是 sync.Once 的实例,一个是数据本身,这带来一些混乱 让 Once 自带数据保存,减少使用时需要定义多个字段,如果需要保存多个数据,可以使用 []interface{} 或者自定义 struct
以下是一个简单的示例: var db Once func DB() *mysql.Client{ return db.Do(f func() interface{}{ return mysql.NewClient(...) }).(*mysql.Client) }
当希望处理错误,可以响应 []interface{} 或者 自定义 struct, 如果在服务或程序初始化阶段可以考虑 panic 来报告错误,如下是使用 []interface{} 的示例: var db Once func DB() (*mysql.Client, error){ res := db.Do(f func() interface{}{ c, err:=mysql.NewClient(...) return []interface{}{c, err} }).([]interface{})
return res[0].(*mysql.Client), res[1].(error) }
使用该方法需要一些取舍,它简单实用,性能无限接近 sync.Once。.
OncePointer 性能方面略好于 Once,但不会有太大改善, 在某些场景下可以使用,更推荐使用 Once.