编辑:我不是在问如何正确初始化变量。我在问如何防止它们被错误地初始化,这样采用该类型的函数就不必显式验证它们的参数。
在 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
只是一个接口(interface)类型。默认值是一个 nil 指针。你非常接近,只需将其初始化为 b := foo.NewBar()
关于go - 如何防止在 Go 中初始化导出类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43858337/