go 要求同一包内的多个源文件必须通过 `go build`(或 `go run .`)整体编译,而非单独运行单个 `.go` 文件;否则会因符号未解析而报 `undefined` 错误。
你遇到的 undefined: NewEmployee 错误,并非因为函数未导出或语法错误,而是构建方式不正确导致 Go 编译器未能将 employee.go 和 main.go 一同纳入编译作用域。
确保两个文件位于同一目录下(例如 ./myapp/),且都声明为 package main(如你所示),然后在该目录中执行:
go run .
或构建后运行:
go build -o myapp . ./myapp
⚠️ 错误示例(导致 undefined):
go run main.go # ❌ 忽略 employee.go,NewEmployee 不可见
导出规则检查:你的 NewEmployee 首字母大写,符合 Go 导出规则(func NewEmployee() ✅),因此只要参与编译,即可被同包其他文件访问。
PrintEmployee 函数存在类型错误:
当前签名 func PrintEmployee(p *Employee) { return "Hello world!" } 声明无返回值,却尝试 return string —— 这会导致编译失败。应修正为:
func PrintEmployee(p *Employee) string {
return "Hello world!"
}或若仅作打印用途,改为:
func PrintEmployee(p *Employee) {
fmt.Println("Hello world!")
}(注意:需 import "fmt")
完整可运行示例
main.go:
package main
import "fmt"
func main() {
emp := NewEmployee()
fmt.Printf("Created: %+v\n", emp)
fmt.Println(PrintEmployee(emp))
}employee.go:
package main
type Employee struct {
name string
age int
}
func NewEmployee() *Employee {
return &Employee{name: "Anony
mous", age: 0}
}
func PrintEmployee(p *Employee) string {
return "Hello world!"
}遵循以上规范,NewEmployee 将被正确定义和调用,undefined 错误自然消失。