Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 未定义同一包中的函数_Go - Fatal编程技术网

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放入另一个包中。这需要:

  • lib.go将存在于与新包同名的文件夹中(例如myLibs)

  • 将包名称添加到lib.go(包myLibs)

  • 然后,大体上:

    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
    不可见(但为什么要尝试正确访问它们?)