golang在另一个文件中声明的“未定义”功能?


135

我正在尝试编写一个基本的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!"
}

您的文件中是否包含打包声明?您输入的内容没有package x,您的主程序包通常仅包含一个文件,然后导入所需的其他文件
Chris Pfohl 2015年

8
你在用go run吗?(看看golang.org/doc/code.html
JimB

1
@JuanM,我的问题是在于完整的源main.goemployee.go?因为所有go文件都应该具有package语句,而您的文件中没有任何文件。请参阅:golang.org/doc/code.html#PackageNames
Chris Pfohl,2015年

1
employee.go的最后一个函数是错误的(没有函数名称,没有声明返回类型)。这不是您要的问题,但是它表明还有更多问题。您可以在编译时发布完整的代码和完整的错误吗?
siritinga 2015年

1
然后告诉我们你在做什么!GOPATH,实际代码以及调用go工具的方式。
JimB 2015年

Answers:


172

请阅读“如何编写Go代码”

不要/src在您的中使用GOPATH。软件包位于中$GOPATH/src

对于buildinstall您需要将文件放在包目录中。

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

go run main.go employee.go

但是,您几乎应该始终使用go install或或go build(最好是使用前者,因为go build使用非主软件包时会引起混淆)


感谢您的输入@JimB!我编辑了环境变量(我也忘记了设置GOBIN),将文件移动到正确的位置,但是当我尝试安装时仍然出现相同的错误。有什么建议?
胡安M

您确定没有其他错误吗?您的employee.go文件无法按原样编译。否则,我需要确切地了解您在做什么。确切的路径,调用等
JimB

8
或做$ go run * .go
Puran

运行$ go run *.go将是一种快捷方式,而不是运行所有文件
offerni

60

我只是在GoLand(Go的Intellij IDEA)中遇到了同样的问题,并找到了解决方案。您需要更改Run kindFilePackageDirectory。如果进入“ Run/Edit配置” ,则可以从下拉菜单中选择。

例如:对于包~/go/src/a_package,用Package patha_packageDirectory~/go/src/a_packageRun kindPackageDirectory


1
谢谢,这就是我想要的。请提及,您的答案与Intellij IDEA有关。
kivagant19年


8

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

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

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

您可以通过键入同时执行两个步骤go build && ./MyProject。它将正确运行所有go文件的项目。

方法02

只需键入go run *.go并按Enter。这将执行所有操作go files

希望这对某人有帮助。


4

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


1

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

我在外面 有Go项目$GOPATH,因此我必须在GO111MODULE=on未启用此选项的情况下将其打开,否则将出现此问题。即使您尝试构建或测试整体packagedirectory否则将无法解决GO111MODULE=on


1

如果您不遵循如何编写go代码,则应立即使用go模块

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

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

go mod init example.com/employee

0

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

  1. cd / go / src / blog ...(包含软件包的文件夹中的cd)
  2. 去安装
  3. 博客

那应该同时运行所有文件,而不必手动列出文件或在命令行中“重击”方法。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.