Go &引用;“未定义”;在另一个文件中声明的函数?

Go &引用;“未定义”;在另一个文件中声明的函数?,go,undefined,func,Go,Undefined,Func,我正在尝试编写一个基本的go程序,该程序调用不同文件上的函数,但它是同一个包的一部分。然而,它返回: undefined: NewEmployee 以下是源代码: main.go: package main func main() { emp := NewEmployee() } package main type Employee struct { name string age int } func NewEmployee() *Employee {

我正在尝试编写一个基本的go程序,该程序调用不同文件上的函数,但它是同一个包的一部分。然而,它返回:

undefined: NewEmployee
以下是源代码:

main.go

package main

func main() {
emp := NewEmployee()    
}
package main

type Employee struct {
    name string
    age int
}   

func NewEmployee() *Employee {
    p := &Employee{}
    return p
}

func PrintEmployee (p *Employee)  {
    return "Hello world!"
}
employee.go

package main

func main() {
emp := NewEmployee()    
}
package main

type Employee struct {
    name string
    age int
}   

func NewEmployee() *Employee {
    p := &Employee{}
    return p
}

func PrintEmployee (p *Employee)  {
    return "Hello world!"
}
请阅读

在包目录中使用
go build
go install
,或为包提供导入路径。不要将文件参数用于
build
install


虽然您可以使用文件参数来运行,但是您应该构建一个包,通常是使用运行,尽管您应该总是使用安装,或者构建,我刚刚在GoLand遇到了同样的问题(这是go的Intellij想法),并找到了一个解决方案。您需要将
运行种类
文件
更改为
目录
。如果进入
Run/Edit
Configurations,您可以从下拉列表中选择此选项


例如:对于包
~/go/src/a_-package
,使用
a_-package
包路径
,以及
~/go/src/a_-package
目录
,如果源文件夹是结构化的/go/src/blog>(假设源文件夹的名称为blog)

  • cd/go/src/blog…(包含您的软件包的文件夹中的cd)
  • 去安装
  • 博客

  • 它应该同时运行您的所有文件,而不是您必须手动列出文件或“猛击”命令行上的一种方法。

    如果您使用的是
    go run
    ,则执行
    go run*.go
    。它将自动查找当前工作目录中的所有go文件,编译并运行主函数。

    如果您想从另一个go文件调用函数,并且正在使用Goland,请从中找到“编辑配置”选项单击“运行”菜单并将运行类型从文件更改为目录。它将清除所有错误,并允许您从其他go文件调用函数。

    您可以尝试以下操作之一:

    方法1

    • 假设您的项目名称是
      MyProject
    • 转到您的路径,运行
      Go build
    • 它将创建一个可执行文件作为您的项目名称(“MyProject”)
    • 然后使用
      /MyProject
    您可以通过键入
    go build&&./MyProject
    同时执行这两个步骤。
    package main
    的go文件被编译为可执行文件

    方法2

    • 只需运行
      go-run*.go
      。它不会创建任何可执行文件,但会运行

    我与
    Go11遇到了同样的问题,我只是想分享一下我是如何解决这个问题的,以帮助其他人,以防他们遇到同样的问题


    我让我的Go项目在外面
    ,所以我必须打开
    GO111MODULE=on
    ,如果不打开此选项,它会给您带来这个问题;即使您尝试构建或测试整个
    目录
    如果没有
    GO111MODULE=on
    就无法解决这个问题.
    将运行您的所有文件。入口点是函数
    main()
    ,它必须是
    main
    包所特有的

    另一个选项是使用
    生成二进制文件并运行它。

    如果您没有遵循

    使用go模块,您不必将代码放在$GOPATH/src中。它也可以放在任何其他位置

    您可以将代码移动到不同的目录,如/employee,使其正好在employee目录下工作初始化go模块

    go mod init example.com/employee
    

    虽然这并不能直接解决OP的具体问题,但我认为我应该加入解决“未定义”错误的方案:具有未定义方法的文件有一个(build标记)

    更具体地说,我无意中在部署的二进制文件使用的实用程序函数文件中包含了一个生成约束,用于从部署的应用程序二进制文件中删除测试文件。因此,在OP的示例中,如果
    employee.go
    有一个生成约束,那么他们的
    go build
    命令需要包含一个
    -tags
    标记匹配约束,以便包含文件

    有关更多信息,请阅读此博客文章:

    您的文件是否有包语句?您键入的文件没有
    包x
    ,而且您的主包通常只包含一个文件,然后导入它所需的其他部分。您可以使用
    运行
    ?(请参阅)@JuanM,我的问题是
    main.go
    employee.go
    ?的完整源代码,因为所有go文件都应该有一个包语句,而我在您的包语句中没有看到任何包语句。请看:employee.go的最后一个函数是错误的(没有函数名,没有声明返回类型)。这不是你要求的问题,但它表明还有更多的问题。你能在编译时发布完整的代码和完整的错误吗?然后告诉我们你在做什么!GOPATH,实际的代码,以及你如何调用
    go
    工具。感谢@JimB!我编辑了环境变量(我还忘了设置GOBIN),将我的文件移动到了正确的位置,但当我尝试运行go intstall时,仍然会出现相同的错误。有什么建议吗?您确定没有其他错误吗?您的employee.go文件无法按原样编译。否则,我需要确切地了解您正在执行的操作。确切的路径、调用等。同时运行
    go run。
    -期间为“此目录”@Puran
    go run*.go
    是个坏主意,因为如果您有任何构建约束或测试文件,它会崩溃。这样做有什么缺点吗?这似乎是OPs问题的最简单答案。在Bash下有一个更通用的解决方案:
    go run!(*\u test)。go
    ——谢谢,这就是我的想法