我试图编写一个基本的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!"
}
提前致谢
答案 0 :(得分:123)
请勿在{{1}}中使用/src
。包位于GOPATH
。
对于$GOPATH/src
或build
,您需要将文件放在包目录中。
对于install
,您需要提供所有文件作为参数:
go run
但是,您应该几乎总是使用go run main.go employee.go
或go install
(最好是前者,因为go build
会在处理非主要包时造成混淆)
答案 1 :(得分:36)
我在GoLand中遇到了同样的问题并找到了解决方案。您需要将Run kind
从File
更改为Package
或Directory
。如果您进入Run/Edit
配置,可以从下拉列表中选择此项。
对于包~/go/src/a_package
,Package path
为a_package
,Directory
为~/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
并按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(假设源文件夹的名称是博客)。
那应该同时运行你的所有文件,而不是你必须手动列出文件或"抨击"命令行上的方法。
答案 9 :(得分:0)
我遇到了Go11
的同一问题,只是想分享一下我如何解决该问题,以帮助其他人以防万一,他们遇到了同样的问题。
我的Go项目位于外部 $GOPATH
,因此我不得不在未启用此选项的情况下打开GO111MODULE=on
,这将给您带来这个问题;即使您尝试构建或测试整个package
或directory
,如果没有GO111MODULE=on
答案 10 :(得分:0)
只需使用命令go run *.go
即可执行包中的所有go文件!
答案 11 :(得分:0)
为此花了一些时间来深入我自己的 MRE,所以希望它会帮助其他人,尽管很简短:
如果您的函数/结构定义在具有 import "C"
的文件中,也会发生这种情况,如果 CGO_ENABLED=0
在您的 go 环境中,它将被静默忽略,导致给你盯着一个不知何故无法在它们之间共享的两个文件包。