Go 文件未运行且不在主包中

moh*_*gla 14 program-entry-point go go-toolchain

我有一个非常简单的 Go 项目设置。在根目录中,我有go.mod文件和main.go一个名为main2. 文件夹里面main2main2.go文件。

/
|_ go.mod
|_ main.go
|_ main2
   |_ main2.go
Run Code Online (Sandbox Code Playgroud)

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

go run main2/main2.go
Run Code Online (Sandbox Code Playgroud)

它会抛出错误:

包命令行参数不是主包

有人可以帮忙吗?

Ale*_*esi 12

main2.go 文件的包必须是main。当项目中有 main 包和 main 函数时,编译器知道它将被编译为可执行文件,而不是库。

因此,尝试更改包命令行参数以将main 打包到 main2/main2.go 文件中。

  • @mohitsingla 您可以在每个包和多个包中创建多个函数。但是要定义程序入口点,您必须定义一个 main 包,并在其中定义一个 main 函数。请参阅:https://go.dev/tour/basics/4 (2认同)

col*_*sen 8

将 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用如下命令运行你的程序:

go run main.go option1

来自golang 文档:

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