【问题标题】:Declaring a struct in a separate golang package cannot return value, but it can when declared specifically在单独的 golang 包中声明一个结构不能返回值,但它可以在明确声明时返回
【发布时间】:2017-01-26 12:56:56
【问题描述】:

尝试从另一个包导入结构类型,它完美返回,但除非在不使用实例化函数的情况下声明,否则无法找到该结构的值。

// X executes and finds values fine, Z does not.

package main

func main () {

    x := &Command{}
    z := command.NewCommand()

    fmt.Println(x.command)
    fmt.Println(z.command)
}

 

package command

type Command struct {
    // Our structured data/object for Command
    alias   string
    command string
    verbose bool
}

func NewCommand() *Command {
    // Creates a new container for []Command objects
    return &Command{"","",false}
}

我到底错过了什么……?

【问题讨论】:

  • 这是全部来源吗?您应该以某种方式在 main 中导入 command 包才能使其正常工作。
  • XZxz 有什么关系?
  • X 是 x,Z 是 z(如果您阅读了代码),它们位于不同的文件夹中,并且导入声明不在这里。因为它与以实际方式显示问题无关。
  • 请确保上面的示例确实重现了您看到的问题。您的示例缺少导入,对 Command 的引用缺少包,并且命令结构的字段未导出,因此您将无法从任一调用访问它们。我不清楚您所描述的问题是什么,并且由于示例代码已损坏,我无法运行它来尝试找出答案。导入肯定与显示问题相关;没有它,我们无法重现您的问题。

标签: function pointers go struct package


【解决方案1】:

您的结构字段需要大写才能在包外访问。

type Command struct {
  // Our structured data/object for Command
  Alias   string
  Command string
  Verbose bool
}

【讨论】:

    【解决方案2】:

    相关的 [golang 规范]( https://golang.org/ref/spec#Exported_identifiers) 是:

    可以导出一个标识符以允许另一个标识符访问它 包裹。如果两者都导出一个标识符:

    标识符名称的第一个字符是 Unicode 大写 字母(Unicode 类“Lu”);并且标识符在 包块或者它是一个字段名或方法名。所有其他 标识符不会被导出。

    由于您的结构字段没有大写,它们不符合导出到另一个包的条件。为了解决这个问题,您需要将要从外部访问的字段大写。

    它可能看起来像这样:

    type Command struct {
        Alias   string
        Command string
        Verbose bool
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 2021-05-30
      • 1970-01-01
      相关资源
      最近更新 更多