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

当前回答

我在Go11上也遇到了同样的问题,只是想分享我是如何解决它的,以帮助其他人,以防他们遇到同样的问题。

我的Go项目在$GOPATH之外,所以我必须打开GO111MODULE=on没有这个选项,它会给你这个问题;即使你尝试构建或测试整个包或目录,如果没有GO111MODULE=on,它也不会解决

其他回答

虽然这并没有直接解决OP的具体问题,但我认为我应该为我的“undefined”错误提供解决方案:具有undefined方法的文件有一个构建约束(构建标记)。

更具体地说,我无意中包含了一个构建约束,以便在部署的二进制文件使用的实用程序函数文件中从部署的应用程序二进制文件中删除测试文件。在OP的例子中,if employee。Go有一个构建约束,他们的Go构建命令需要包含一个匹配约束的-tags标志,以便包含文件。

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

你可以试试下面的方法:

方法1:

假设您的项目名称是MyProject 去你的路径,运行- Go - build 它将创建一个可执行文件作为您的项目名称(“MyProject”) 然后使用。/MyProject运行可执行文件

你可以通过输入go build && ./MyProject同时完成这两个步骤。包main的Go文件被编译成可执行文件。

方法2:

快跑,快跑,快跑。它不会创建任何可执行文件,但它可以运行。

跑题了,但仍然:-)

之前:

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

后:

func NewEmployee() *Employee {
    return &Employee{}
}

不需要创建新变量。就回来了。

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

如果你在使用go run,一定要去run *。go。它会自动找到当前工作目录下的所有go文件,编译然后运行main函数。