是否错误复制“包主”中的“func main”以及为什么错误?

问题描述 投票:-3回答:1

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


// $ 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")
}

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

go build package main golang-migrate
1个回答
6
投票

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

如果你在同一个文件夹中有两个文件,都有package main声明,这正是你正在做的。这就是你的IDE抱怨的原因:它试图将这两个文件构建/编译为一个包,与编写go build .相同:这指定当前文件夹中的包,包括所有源文件。

go run main.gogo run second.go之所以有效,是因为您指定要构建的文件(更具体地说是单个文件),而不是包。有一个main.gosecond.gomain包不违反上述规则:每个文件只包含main()函数一次。

简而言之:go run main.go无视second.go

通常,如果您想在同一个项目中创建多个具有多个main()函数的应用程序,最简单的方法是将不同的main()函数放在不同的文件夹中,通常位于cmd文件夹中。

See Command Go:

Compile packages and dependencies

用法:

go build [-o output] [-i] [build flags] [packages]

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

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

Compile and run Go program

用法:

go run [build flags] [-exec xprog] package [arguments...]

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

另见What does go build build?

© www.soinside.com 2019 - 2024. All rights reserved.