非 main 包中的 Go 文件无法运行。

12
我有一个非常简单的Go项目设置。 在根目录下,我有一个名为go.mod的文件和一个名为main.go的文件以及一个名为main2的文件夹。在main2文件夹中,有一个名为main2.go的文件。
/
|_ go.mod
|_ main.go
|_ main2
   |_ main2.go

我正在尝试从根目录运行go run命令

go run main2/main2.go

我遇到了错误,它的提示消息是:

package command-line-arguments不是主要包

有人能帮忙解决吗?


1
永远不要使用带有文件名参数的go run命令。 - Volker
7
“@Volker 一份解释比晦涩难懂的命令更有帮助。” - jub0bs
1
@jub0bs go run path/to/file.go 意味着你传递的文件是主包,并且有一个 main 函数。如果你的主包在 cmd/foo/main.go 中,很可能你正在导入其他包,或者主包中有其他包含从 main 调用的函数的文件。例如,如果 cmd/foo/main.go 调用了 cmd/foo/helpers.go 中的函数,则该文件不会被传递给 go run,因此这些函数将未定义,导致 go run 错误。go run 编译并运行,所以只需 go build ./cmd/foo 并运行二进制文件,更加简单和安全。 - Elias Van Ootegem
2个回答

9

您的main2.go文件的包必须是main。当存在主要包和项目中的主函数时,编译器会将其编译为可执行文件而不是库。

因此,请尝试在main2/main2.go文件中更改package command-line-argumentspackage main


这是否意味着我们只能运行主包的主函数,而不能运行除主包以外的任何其他包的任何其他函数? - mohit singla
1
@mohitsingla 你可以在每个包中创建多个函数和多个包。但是为了定义程序的入口点,你必须定义一个主包,并在其中定义一个主函数。请参见:https://go.dev/tour/basics/4 - Alex Lucchesi

6

想象一下,一个 Golang 可执行文件就像是一个只有前门和许多不同房间的房子。一旦你进入了这个房子,你可以通过任何门进入,但是要进入房子,你必须先通过前门。这个前门就是 main() 函数。

Golang 可执行文件的入口是通过 main() 函数。如果你想为单个可执行文件运行不同的逻辑路径,你可以使用 main() 作为路由函数来使用命令行参数连接其他包:

package main

import (
    "os"
    "otherpackage"
    // Your child packages get imported here.
)

func main() {

    // The first argument
    // is always program name
    // So os.Args[1] is the first dynamic argument
    arg1 := os.Args[1]

    // use arg1 to decide which packages to call
    if arg1 == "option1" {
        // option1 code executes here.
        otherpackage.DoThis()
    }
    if arg1 == "option2" {
        // option2 code executes here.
        otherpackage.DoThat()
    }
}

然后,您可以使用类似以下的命令运行程序:

go run main.go option1

来源于Go语言文档:

程序执行 通过将一个未导入的包(称为主包)与其传递导入的所有包链接起来,可以创建完整的程序。主包必须具有“main”包名称,并声明一个不带参数且不返回任何值的“main”函数。


这是否意味着我们只能运行主包的主函数,而不能运行除主包以外的任何其他包的任何其他函数? - mohit singla
1
你仍然可以运行那些其他函数,但它们必须在源自 package main 中的 main() 调用堆栈的某个位置被调用。 - colsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接