【问题标题】:Access struct property in Go [duplicate]在 Go 中访问结构属性 [重复]
【发布时间】:2018-01-30 14:30:08
【问题描述】:

现在我已经实现了这个接口的结构,如下所示

type MyRunner struct {
    path string
}

func (r MyRunner) soSomthing(newPath string) error {
    run(path)
    return nil
}

现在我想创建对象,但出现错误 MyRunner 文字中未导出字段“路径”的隐式分配

我就是这样做的

&run.MyRunnter{”a/b/c/“}

有没有办法在 Go 中不使用 New 关键字?

【问题讨论】:

  • 您正在尝试访问(设置、获取、无关紧要)另一个包中未导出的字段。即使您尝试使用复合文字来初始化它,编译器也不会让您这样做。
  • @Marc - 好的,但我试图初始化对象为什么它不工作,我需要它......
  • 因为这与run.MyRunner{path:"a/b/c"} 相同,所以您仍在访问来自另一个包的未导出字段。如果你想初始化你的对象,你可以在同一个包中有一个助手:func NewRunner(p string) *Runner { return &Runner{path: p} },或者只是导出字段。
  • @Marc - 非常感谢,首选哪种方式?
  • 这最终取决于是否应该从包外部使用此字段。如果您不在乎,请将其导出。

标签: go struct


【解决方案1】:

在 Go 中,每个以小写字母开头的字段都被认为是私有的,并且只能在其包中访问。只需将名称更改为Path

type MyRunner struct {
    Path string
}

这条规则适用于 Go 中的其他标识符:类型名称、函数名称。请参阅文档中的Exported identifiers

如果您不想公开该字段。编写一个作为构造函数的函数。

type MyRunner struct {
    path string
}

func NewMyRunner(path string) *MyRunner {
    return &MyRunner{path}
}

来自标准库container.list.New的示例

【讨论】:

  • 好的,谢谢1+,因为我需要将它用作构造函数字段,它应该是“public”,对吗?还是应该使用访问器方法?
猜你喜欢
  • 2020-03-15
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
相关资源
最近更新 更多