Go 未定义同一包中的函数
我的项目结构是这样的Go 未定义同一包中的函数,go,Go,我的项目结构是这样的 packagetest/ main.go lib.go 在main.go中,我有这个代码 package main import "fmt" func main() { fmt.Println("Hello from main.go.") Test() } package main import "fmt" func Test() { fmt.Println("This is the Test function in li
packagetest/
main.go
lib.go
在main.go
中,我有这个代码
package main
import "fmt"
func main() {
fmt.Println("Hello from main.go.")
Test()
}
package main
import "fmt"
func Test() {
fmt.Println("This is the Test function in lib.go.")
}
在lib.go
中,我有这个代码
package main
import "fmt"
func main() {
fmt.Println("Hello from main.go.")
Test()
}
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
在网页上,您可以阅读有关build
命令的内容,该命令包括:
如果参数是.go文件的列表,则build将其视为指定单个包的源文件列表
因此,go build main.go
将main.go视为一个包。相反,您应该使用:
go build
包括文件夹中的所有文件。这是一篇旧文章,但它没有清楚地回答我的问题,因此我将在以后为其他人的利益发帖 当运行
go run--help
时,您会发现本手册:
Run编译并运行包含命名Go源文件的主包。
Go源文件定义为以文字“.Go”后缀结尾的文件
默认情况下,“go run”直接运行编译后的二进制文件:“a.out arguments…”
go-run
用于只有几个文件的小程序。对于多个文件,您将遇到一个问题,您的main.go
找不到其他文件,因为go-run
除非命名,否则不会编译并隐式链接它们。这就是为什么go build
或者,
go-run*.go
(构建所有文件)应该在大部分时间都可以工作。我认为问题在于,使用package main只能有一个文件
尝试将lib.go放入另一个包中。这需要:
import myLibs
call myLibs.Test()
应重命名为lib.go
main\u test.go
- 测试函数的函数签名应该是
func test(t*testing.t){
- 软件包
应在测试
中导入main\u test.go
- 理想情况下,
函数应该有一个反映其测试内容的名称,比如Test
TestPrinting
然后
go-build
和go-test
都应该可以工作。如果您不想build
,也可以尝试下面的命令,但只需执行它:
go run main.go lib.go
如果对Go main pkg使用多个文件,而不是像Go run main.Go那样使用单个文件路径,则在run或build命令中使用Go require main pkg dir,如:
#from outside packagetest dir
go run ./packagetest/
go build ./packagetest/
#from within packagetest:
go run ./
go build ./
当go找不到其他文件(如本例中的
lib.go
)时,就会出现此问题
如果您使用JetBrains Goland,您应该将“跑步种类”更改为“目录”。Goland将帮助您完成以下操作:
开始构建。
- 运行此执行文件
如果你使用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
...
当您选择“目录”并选择您的目录,然后运行时,您将看到如下内容:
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
...
运行所有文件,然后能够调用
go run *.go
或
当我运行时:
go-run*.go
,它说:CreateFile*.go:文件名、目录名或卷标语法不正确。
(go版本go1.10 windows/amd64,windows 10 x64)对于那些可能与我有相同问题的人,可能存在重复的:请注意,main\u test.go
中的定义对main.go
不可见(但为什么要尝试正确访问它们?)