-2

请帮助我理解为什么“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")
}

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

4

1 回答 1

7

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

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

go run main.go并且go run second.go有效,因为您指定要构建的文件(更具体地说是单个文件),而不是包。并且拥有单个main.go或被包不违反上述规则:每个文件只包含second.go一次函数。mainmain()

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

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

请参阅命令 Go:

编译包和依赖

用法:

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

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

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

编译运行 Go 程序

用法:

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

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

另请参阅go build 构建什么?

于 2019-04-15T07:31:07.497 回答