我的项目结构是这样的。
packagetest/
main.go
lib.go
在main.go
,我有这个代码。
package main
import "fmt"
func main() {
fmt.Println("Hello from main.go.")
Test()
}
在lib.go
,我有这个代码。
package main
import "fmt"
func Test() {
fmt.Println("This is the Test function in lib.go.")
}
当我尝试用go build main.go
编译时,我得到了./main.go:7: undefined: Test
。这种构造我的代码的方式是否可行?
尝试只运行go build
。当你给它一个go文件作为参数时,它不会寻找其他go文件。你也可以做go build *.go
这是一个很老的帖子,但它没有清楚地回答我的问题,所以我将来为了其他人的利益而张贴。
运行go run --help
时,您会找到本手册:
运行编译并运行包含命名的Go源文件的主包。 Go源文件被定义为以文字“.go”后缀结尾的文件。
默认情况下,'go run'直接运行已编译的二进制文件:'a.out arguments ...'。
go run <filename.go>
用于只有几个文件的小程序。对于几个文件,您将遇到main.go
无法找到其他文件的问题,因为go run
不会编译并隐式链接它们,除非命名。这就是go build
项目有效的原因。
或者,go run *.go
(构建所有文件)应该在大多数时间工作。
在golang.org网页上,您可以阅读有关build
命令:
如果参数是.go文件的列表,则build会将它们视为指定单个包的源文件列表。
所以,go build main.go
会将main.go视为一个包。相反,你应该使用:
go build
包括文件夹中的所有文件。
我认为问题是你只能使用包main一个文件。
尝试将lib.go放在不同的包中。这需要:
然后,在主要:
import myLibs
call myLibs.Test()
lib.go
应更名为main_test.go
func Test(t *testing.T) {
testing
应该在main_test.go
进口。Test
函数应该有一个反映它正在测试的名称,如TestPrinting
。然后go build
和go test
都应该工作。