golang“undefined”函数在另一个文件中声明?

时间:2015-01-26 15:27:12

标签: go undefined func

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

undefined: NewEmployee

以下是源代码:

main.go

package main

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

employee.go

package main

type Employee struct {
    name string
    age int
}   

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

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

提前致谢

12 个答案:

答案 0 :(得分:123)

请阅读"How to Write Go Code"

请勿在{{1​​}}中使用/src。包位于GOPATH

对于$GOPATH/srcbuild,您需要将文件放在包目录中。

对于install,您需要提供所有文件作为参数:

go run

但是,您应该几乎总是使用go run main.go employee.go go install(最好是前者,因为go build会在处理非主要包时造成混淆)

答案 1 :(得分:36)

我在GoLand中遇到了同样的问题并找到了解决方案。您需要将Run kindFile更改为PackageDirectory。如果您进入Run/Edit配置,可以从下拉列表中选择此项。

对于包~/go/src/a_packagePackage patha_packageDirectory~/go/src/a_package。您可以选择自己喜欢的Run kind

答案 2 :(得分:5)

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

答案 3 :(得分:4)

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

答案 4 :(得分:4)

您可以尝试以下方法之一。

方法01 :假设您的项目名称为MyProject

  • 转到您的路径,输入go build并按Enter。
  • 它将创建一个可执行文件作为您的项目名称(“ MyProject”)
  • 然后在您的终端中输入./MyProject并按Enter键

您可以通过输入go build && ./MyProject一次完成两个步骤。它将使用所有go个文件正确运行您的项目。

方法02

只需键入go run *.go,然后按Enter。这将执行您所有的go files

希望这对某人有帮助。

答案 5 :(得分:3)

go run .将运行您的所有文件。入口点是功能main(),它对于main包来说是唯一的。

另一种选择是使用go build构建二进制文件并运行它。

答案 6 :(得分:1)

如果您不关注go modules

,则应立即使用How to write go code

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

您可以将代码移至/ employee之类的其他目录,以使其正常工作在雇员目录下,初始化go模块

go mod init example.com/employee

答案 7 :(得分:1)

虽然这并没有直接解决 OP 的具体问题,但我想我可以解决我的“未定义”错误:具有未定义方法的文件有一个 build constraint(构建标记)。

更具体地说,我不小心包含了一个构建约束,以从我部署的二进制文件使用的实用程序函数文件中删除我部署的应用程序二进制文件中的测试文件。因此,在 OP 的示例中 - 如果 employee.go 有构建约束,则其 go build 命令需要包含与约束匹配的 -tags 标志,以便包含文件。

欲了解更多信息,请阅读这篇博文: https://dave.cheney.net/tag/build-constraints

答案 8 :(得分:0)

如果你的源文件夹是结构化的/ go / src / blog(假设源文件夹的名称是博客)。

  1. cd / go / src / blog ...(包含您的包的文件夹中的cd)
  2. 去安装
  3. 博客
  4. 那应该同时运行你的所有文件,而不是你必须手动列出文件或"抨击"命令行上的方法。

答案 9 :(得分:0)

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

我的Go项目位于外部 $GOPATH,因此我不得不在未启用此选项的情况下打开GO111MODULE=on,这将给您带来这个问题;即使您尝试构建或测试整个packagedirectory,如果没有GO111MODULE=on

也无法解决。

答案 10 :(得分:0)

只需使用命令go run *.go即可执行包中的所有go文件!

答案 11 :(得分:0)

为此花了一些时间来深入我自己的 MRE,所以希望它会帮助其他人,尽管很简短:

如果您的函数/结构定义在具有 import "C" 的文件中,也会发生这种情况,如果 CGO_ENABLED=0 在您的 go 环境中,它将被静默忽略,导致给你盯着一个不知何故无法在它们之间共享的两个文件包。