go - 如何防止在 Go 中初始化导出类型?

标签 go null segmentation-fault initialization

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

在 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/

相关文章:

go - gRPC 到远程服务器的带宽较慢

go - 在 Golang exec 中使用管道运行命令

c++ - 错误 : "null" was not declared in this scope

c# - 为什么要编译?

c - 在 C 中使用线程的段错误

GOPATH 正在寻找不同的路径

go - ParseInt() 中使用的基本参数是什么?

cocos2d-iphone - nsmutablearray 在调用时不添加对象

c - 使用 fscanf 将数据输入动态结构指针数组?

perl - binmode + mod_perl 2.0.5 + Parse::RecDescent = 段错误