【问题标题】:Is it wrong duplicate "func main" in "package main" and why it is wrong?在“package main”中重复“func main”是否错误,为什么它是错误的?
【发布时间】:2019-09-05 03:14:27
【问题描述】:

请帮助我理解为什么“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 package main golang-migrate


【解决方案1】:

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

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

go run main.gogo run second.go 有效,因为您指定要构建的 files(更具体地说是单个文件),而不是包。并且将单个main.gosecond.go 作为main 包并不违反上述规则:每个文件只包含一次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...]

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

另见What does go build build?

【讨论】:

  • 感谢您的回复。我找不到有关此案例的文档。像这样的短语:您可以使用两种可能性,但建议...
猜你喜欢
  • 2019-08-05
  • 1970-01-01
  • 2016-12-22
  • 2011-09-24
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多