Golang标准类型封装器的命名指南
Golang标准类型封装器的命名指南
sync.Once 导出了 Do(f func()) 方法,该方法允许在多个并发请求下仅执行一次函数。如果我创建一个自己的类型,并导出一个方法:Do(f func() interface) interface,该方法做完全相同的事情,但额外返回一个值,那么这样的结构体叫什么名字好呢?我认为 Once 是一个很好的结构体名称,因为可以通过包名区分 helpers.Once 和 sync.Once。但我的代码收到了反馈,说类似的名称可能会引起混淆。
你们对此有什么看法?
更多关于Golang标准类型封装器的命名指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,类型命名应当清晰传达其用途,避免与标准库中的同名类型产生混淆,即使包名不同。sync.Once 是一个广泛使用的标准类型,其行为是执行一次且无返回值。如果你创建了一个类似但返回值的类型,使用 Once 作为名称确实容易导致误解,特别是当代码被导入到其他包时,开发者可能误以为它是标准库的变体或扩展。
更好的做法是选择一个更具描述性的名称,明确其核心差异:即返回值的特性。例如,可以考虑使用 OnceWithValue、OnceResult 或 CachedOnce 等名称。这些名称直接表明了与 sync.Once 的区别,减少了混淆的可能性,同时保持了代码的可读性和自解释性。
示例代码:
package helpers
import "sync"
type OnceWithValue struct {
once sync.Once
value interface{}
err error
}
func (o *OnceWithValue) Do(f func() (interface{}, error)) (interface{}, error) {
o.once.Do(func() {
o.value, o.err = f()
})
return o.value, o.err
}
这样,OnceWithValue 清晰地传达了“执行一次并返回值”的语义,避免了与 sync.Once 的命名冲突。

