函数在同一个包中未定义

问题描述 投票:25回答:5

我的项目结构是这样的。

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
5个回答
36
投票

尝试只运行go build。当你给它一个go文件作为参数时,它不会寻找其他go文件。你也可以做go build *.go


10
投票

这是一个很老的帖子,但它没有清楚地回答我的问题,所以我将来为了其他人的利益而张贴。

运行go run --help时,您会找到本手册:

运行编译并运行包含命名的Go源文件的主包。 Go源文件被定义为以文字“.go”后缀结尾的文件。

默认情况下,'go run'直接运行已编译的二进制文件:'a.out arguments ...'。

go run <filename.go>用于只有几个文件的小程序。对于几个文件,您将遇到main.go无法找到其他文件的问题,因为go run不会编译并隐式链接它们,除非命名。这就是go build项目有效的原因。

或者,go run *.go(构建所有文件)应该在大多数时间工作。


5
投票

golang.org网页上,您可以阅读有关build命令:

如果参数是.go文件的列表,则build会将它们视为指定单个包的源文件列表。

所以,go build main.go会将main.go视为一个包。相反,你应该使用:

go build

包括文件夹中的所有文件。


1
投票

我认为问题是你只能使用包main一个文件。

尝试将lib.go放在不同的包中。这需要:

  1. lib.go存在于与新包具有相同名称的文件夹中(例如,myLibs)。
  2. 将包名添加到lib.go(包myLibs)。

然后,在主要:

import myLibs
call myLibs.Test()

0
投票
  • lib.go应更名为main_test.go
  • 测试函数的函数签名应该是func Test(t *testing.T) {
  • testing应该在main_test.go进口。
  • 理想情况下,Test函数应该有一个反映它正在测试的名称,如TestPrinting

然后go buildgo test都应该工作。

© www.soinside.com 2019 - 2024. All rights reserved.