写点什么

【Go】go build 失败,报方法 undefined

作者:非晓为骁
  • 2022 年 9 月 19 日
    福建
  • 本文字数:734 字

    阅读完需:约 2 分钟

记一次在写 cli 脚本的时候,碰到的一个问题。

问题

自己是写服务端的,有时候会写一些 cli 脚本去跑测试。习惯 main.go 写主流程,其他子文件写方法,这样子代码不会都在 main.go 里面。但这么写直接 GoLand 点击 main 旁边的按钮是可以执行,一旦用 go build 就报某个引用的方法,undefined。

范例代码

//main.gopackage main
import "fmt"
func main() { fmt.Println("add result : ", Add(1, 2)) fmt.Println("multi result : ", Multi(1, 2))}
复制代码


//operation.gopackage main
func Add(a, b int) int { return a + b}
func Multi(a, b int) int { return a * b}
复制代码


注意这是两个文件,不是都在 main.go 里面,package 都是 main。这两个文件,都在同一个目录下面。

操作

  1. 直接点击 run,结果是有的,也没有报错




  1. go build 就报错,原本调用的方法 undefined

  2. 但是上一步可以执行呀,也有结果

解决

原因是 go 语言中 main 包和其他 package 是不同的,它定义了一个独立可执行程序,而不是一个库。一般的包名是.go 文件的目录名,编译器会将同一目录下的不同.go 文件视作同一个包。但是 main 包的目录不是 main 目录,所以问题就是在包的引用和定义上,如果想在 main 包中添加函数调用,2 个方法:


  1. 写在 main 函数所在的 go 文件中;

  2. 创建另一个 package,main 函数去调用这个包。【建议】

修改后代码

// main.gopackage main
import ( "fmt" "train/package/operation")
func main() { fmt.Println("add result : ", operation.Add(1, 2)) fmt.Println("multi result : ", operation.Multi(1, 2))}
复制代码


operation.go 放到一个单独的包


// operation.gopackage operation
func Add(a, b int) int { return a + b}
func Multi(a, b int) int { return a * b}
复制代码


此时再 go build 就可以解决了。


用户头像

非晓为骁

关注

no pain no gain 2019.04.10 加入

用我的勤奋,一点一点地努力,提升自己的能力,拓展自己的视野,提高自己的认知。 我的知乎:https://www.zhihu.com/people/zhengfke

评论

发布
暂无评论
【Go】go build失败,报方法undefined_Go_非晓为骁_InfoQ写作社区