我的项目结构是这样的。
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
。这种构造我的代码的方式是否可行?
答案 0 :(得分:37)
尝试只运行go build
。当你给它一个go文件作为参数时,它不会寻找其他go文件。您也可以go build *.go
答案 1 :(得分:10)
这是一篇很老的帖子,但它没有清楚地回答我的问题,所以我将来为了别人的利益而张贴。
运行go run --help
时,您会找到本手册:
运行编译并运行包含命名Go源文件的主包。 Go源文件被定义为以文字结尾的文件" .go"后缀。
默认情况下,' go run'直接运行已编译的二进制文件:' a.out参数......'。
go run <filename.go>
用于只有少量文件的小程序。对于多个文件,您将遇到main.go
无法找到其他文件的问题,因为go run
除非已命名,否则不会隐式编译和链接它们。这就是项目工作go build
的原因。
或者,go run *.go
(构建所有文件)应该在大多数时间都有效。
答案 2 :(得分:5)
在golang.org网页上,您可以阅读有关build
命令的信息:
如果参数是.go文件的列表,则build会将它们视为指定单个包的源文件列表。
因此,go build main.go
会将main.go视为单个包。相反,你应该使用:
go build
包含文件夹中的所有文件。
答案 3 :(得分:2)
当go找不到其他文件时(例如本示例中的lib.go
),就会发生此问题。
如果使用JetBrains Goland,则应将“运行种类”更改为“目录” 。 Goland将帮助您做到这些:
go build .
如果使用JetBrains Goland,则可以对比“运行种类”之间的区别。
当我选择“文件”,然后运行时,您将在控制台上看到如下消息:
GOROOT=C:\Go #gosetup
GOPATH=C:\Users\hgs\go #gosetup
C:\Go\bin\go.exe build -o C:\Users\hgs\AppData\Local\Temp\___go_build_select_go__4_.exe "C:/Users/hgs/Google Drive/My Maps/computer/2.programming_lang/Golang/source-code-refer/basic/select.go" #gosetup
# command-line-arguments
.\select.go:14:16: undefined: Add
当您选择“目录”并选择目录,然后运行时,您将看到以下内容:
GOROOT=C:\Go #gosetup
GOPATH=C:\Users\hgs\go #gosetup
C:\Go\bin\go.exe build -o C:\Users\hgs\AppData\Local\Temp\___go_build_basic_.exe . #gosetup
C:\Users\hgs\AppData\Local\Temp\___go_build_basic_.exe #gosetup
...
答案 4 :(得分:1)
我认为问题是你只能使用包main一个文件。
尝试将lib.go放在不同的包中。这需要:
lib.go存在于与新包名称相同的文件夹中(例如,myLibs)。
将包名添加到lib.go(包myLibs)。
然后,在主要:
import myLibs
call myLibs.Test()
答案 5 :(得分:1)
如果要对Go main pkg使用多个文件,而不是对go main.go使用单个文件路径,请在run或build命令中使用go要求main pkg目录,例如:
#from outside packagetest dir
go run ./packagetest/
go build ./packagetest/
#from within packagetest:
go run ./
go build ./
答案 6 :(得分:0)
lib.go
应该重命名为main_test.go
func Test(t *testing.T) {
testing
应该导入main_test.go
中。Test
函数应具有反映其测试内容的名称,例如TestPrinting
。然后go build
和go test
都应该起作用。
答案 7 :(得分:0)
如果您不想build
,只需执行以下命令,也可以尝试以下命令:
go run main.go lib.go
答案 8 :(得分:0)
运行所有文件然后可以调用
go run *.go
或
go run main.go lib.go