如何防止在 Go 中初始化导出的类型



编辑:我不是在问如何正确初始化变量。 我问如何防止它们被错误初始化,以便采用该类型的函数不必显式验证其参数。

在 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()

相关内容

  • 没有找到相关文章

最新更新