在“ package main”中重复的“ func main”是否错误,为什么错误?

Rom*_*man -3 program-entry-point build package go golang-migrate

请帮助我理解为什么“ package main”中重复的“ func main”是错误的。VC中的错误:“在此块中重新声明了main”。


// $ tree
// .
// ??? main.go
// ??? second.go

// ```go build main.go```
// or 
// ```go build .```


// file: main.go
package main

import (
    "fmt"
)

func main() {
    fmt.Println("this is file MAIN")
}

// file: second.go
package main

import (
    "fmt"
)

func main() {
    fmt.Println("this is file SECOND")
}

Run Code Online (Sandbox Code Playgroud)

我可以构建/运行它:go build / run main.go-正确的go build / run。-错误

icz*_*cza 6

在同一包中,不能在包级别两次声明相同的符号。

而且,如果您在同一文件夹中有2个文件,两个文件都有package main声明,那正是您要执行的操作。这就是您的IDE抱怨的原因:它试图将这2个文件作为一个包构建/编译,就像编写一样go build .:这将在当前文件夹中指定包,包括所有源文件。

go run main.gogo run second.go之所以可以使用,是因为您指定了要构建的文件(更具体地说是单个文件),而不是打包文件。并且拥有一个main.gosecond.go成为main软件包不会违反上述规则:每个文件仅包含main()一次功能。

简而言之:go run main.go 忽略 second.go

通常,如果要main()在同一项目中创建具有多个功能的多个应用程序,则最简单的做法是将不同main()功能放置在不同的文件夹中,通常是放在一个cmd文件夹中。

请参阅Command Go:

编译软件包和依赖项

用法:

go build [-o output] [-i] [build flags] [packages]
Run Code Online (Sandbox Code Playgroud)

Build编译由导入路径命名的包及其依赖项,但不会安装结果。

如果要构建的参数是.go文件列表,则build会将其视为指定单个程序包的源文件列表。

编译并运行Go程序

用法:

go run [build flags] [-exec xprog] package [arguments...]
Run Code Online (Sandbox Code Playgroud)

运行编译并运行命名的主Go软件包。通常,该软件包被指定为.go源文件的列表,但也可以是与单个已知软件包匹配的导入路径,文件系统路径或模式,如“ go run”中所示。或“运行我的/ cmd”。

另请参阅构建内容是什么?