我总是发现 go 中的 package.New() 语法很难使用。
建议是,如果一个包只包含一个类型,则使用 package.New() 创建一个实例;如果存在多种类型,则使用 package.NewBlah()。 http://golang.org/doc/effective_go.html#package-names
但是,如果您有一个带有 New() api 的现有包,则这种方法会失败,向包添加新的外部类型会破坏 api,因为您现在必须重命名此 NewFoo()。现在你必须去改变任何使用 New() 的东西,这很烦人。
......我只是对写这篇文章的审美不满:
import "other"
import "bar"
import "foo"
o := other.New() // <-- Weird, what type am I getting? No idea.
x := bar.New()
y := foo.NewFoo() // <-- Awkward, makes constructor naming look inconsistent
z := foo.NewBar()
所以,最近我一直在使用这种模式:
x := foo.Foo{}.New() // <-- Immediately obvious I'm getting a Foo
y := foo.Bar{}.New() // <-- Only an additional 3 characters on NewBar{}
o := other.Foo{}.New() // <-- Consistent across all packages, no breakage on update
模块的定义如下:
package foo
type Foo struct {
x int
}
func (s Foo) New() *Foo {
// Normal init stuff here
return &s // <-- Edit: notice the single instance is returned
}
type Bar struct {
}
func (Bar) New() *Bar {
return &Bar{} // <-- Edit: Bad, results in double alloc. Not like this.
}
Godoc 似乎可以很好地使用它,而且对我来说似乎更明显和一致,没有额外的冗长。
所以,问题:这有什么明显的缺点吗?