为什么"go run"命令无法在主包中找到第二个文件?

rob*_*bmj 7 package go go-toolchain

我遇到了go run main.go产生错误的问题:

# command-line-arguments
./main.go:9: undefined: test
Run Code Online (Sandbox Code Playgroud)

但是命令go build && ./goruntest编译并运行程序就好了.

输出是:

嗨来自test()

嗨,来自sameFileTest()

您好,来自pkgtest.Test()

您好,来自pkgtest.Test1()

我有这样的目录设置:

go/src/github.com/username/goruntest/
    pkgtest/
        pkgtest.go
        pkgtest1.go
    main.go
    test2.go
Run Code Online (Sandbox Code Playgroud)

这是代码.

main.go

package main

import (
    "fmt"
    "github.com/username/goruntest/pkgtest"
)

func main() {
    fmt.Println(test())           // main.go:9
    fmt.Println(sameFileTest())
    fmt.Println(pkgtest.Test())
    fmt.Println(pkgtest.Test1())
}

func sameFileTest() string {
    return "Hi from sameFileTest()"
}
Run Code Online (Sandbox Code Playgroud)

gotest1.go

package main

func test() string {
    return "Hi from test()"
}
Run Code Online (Sandbox Code Playgroud)

pkgtest/pkgtest.go

package pkgtest

func Test() string {
    return "Hi from pkgtest.Test()"
}
Run Code Online (Sandbox Code Playgroud)

pkgtest/pkgtest1.go

package pkgtest

func Test1() string {
    return "Hi from pkgtest.Test1()"
}
Run Code Online (Sandbox Code Playgroud)

我知道问题是第二个文件的一部分,package main我也理解没有真正的理由让第二个文件进入main.

我的问题是:为什么go run无法处理此设置但是构建和运行可执行文件的工作正常?

编辑

包含第二个文件 pkgtest

我也明白命令go run main.go gotest1.go有效,但为什么需要指定gotest1.go

为简洁起见,我最初省略了这些细节.但现在我发现他们对这个问题很重要.

dsk*_*ner 6

尝试提供所有相关文件 go run

$ go help run
usage: go run [build flags] [-exec xprog] gofiles... [arguments...]

Run compiles and runs the main package comprising the named Go source files.
A Go source file is defined to be a file ending in a literal ".go" suffix.
Run Code Online (Sandbox Code Playgroud)