编辑:我不是在问如何正确初始化变量。 我问如何防止它们被错误初始化,以便采用该类型的函数不必显式验证其参数。
在 Go 中,我有一个包含地图的类型,例如:
package foo
type Bar struct {
baz map[string]int
total int
}
func NewBar() *Bar {
return &Bar{baz: map[string]int{}}
}
func (b *Bar) IncrementBaz(key string) {
f.baz[key] = f.baz[key] + 1
f.total++
}
// ...
如果另一个包初始化该类型,然后尝试写入它,它将尝试写入 nil 映射,从而导致段错误:
package main
import "foo"
func main() {
var b foo.Bar
b.IncrementBaz("some_key") // write to nil map -> segfault
// ...
}
为了防止这种情况,我想让它使其他包无法初始化空foo.Bar
。
我不能简单地让它不导出,因为我希望其他包中的函数能够将其声明为参数或返回类型。 如果我将其包装在接口中,则会遇到类似的问题:
package "foo"
type Bar interface {
IncrementBaz(string)
// ...
}
type bar struct {
baz map[string]int
total int
}
func NewBar() Bar {
return &bar{baz: map[string]int{}}
}
func (b *bar) IncrementBaz(key string) {
f.baz[key] = f.baz[key] + 1
f.total++
}
// ...
类似的问题:
package main
import "foo"
func main() {
var b foo.Bar
b.IncrementBaz("some_key") // method call on nil interface -> segfault
// ...
}
有没有办法拥有一个导出的类型,只有声明它的包才能初始化它?
现在foo.Bar
只是一个接口类型。默认值为 nil 指针。您非常接近,只需将其初始化为b := foo.NewBar()