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

当前回答

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

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

虽然你可以为go run使用file参数,但你应该构建一个包,通常使用go run .,尽管你几乎总是应该使用go install或go build。

其他回答

如果你的源文件夹是structured /go/src/blog(假设你的源文件夹的名字是blog)。

CD /go/src/blog…(cd在有你的包的文件夹内) 去安装 博客

这样可以同时运行所有文件,而不必手动列出文件或在命令行上“敲打”某个方法。

花了一段时间来研究我自己的MRE,所以希望它能帮助其他人,尽管很简短:

如果你的函数/结构定义在一个导入“C”的文件中,如果你的go环境中是CGO_ENABLED=0,它将被无声地忽略,导致你盯着两个文件包,以某种方式无法在它们之间共享,也会发生这种情况。

在我的一个go文件中,我有一个讨厌的导入“C”。

你现在应该使用go模块,如果你没有遵循如何编写go代码

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

你可以把代码移动到不同的目录,比如/employee,让它工作,在employee目录下初始化go模块

go mod init example.com/employee

跑题了,但仍然:-)

之前:

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

后:

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

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