VIM Go Syntastic: main redeclared

17

VIM的Syntastic插件与.go文件配合使用效果良好。但有时我想在同一个文件夹中放置多个带有main()方法的go文件,以便我可以针对每个文件(演示)使用go run xxx命令。当我保存第二个文件(prog2.go)时,这将导致错误:

main在prog1.go的先前声明块中重复声明

我该如何告诉Syntastic忽略这些错误?

更新1

官方的Go语言演讲,如Rob Pike的“Go并发模式”和Francesc Campoy Flores的“十二种最佳实践”,都将源文件放在同一个文件夹中。因此,这个问题不是关于运行go文件的最佳实践,而是如何抑制或忽略此警告。

更新2

在我提出问题 这里之后,作者清楚地回答了我的问题。这正是我需要的。谢谢大家。

6个回答

34

由于这是一个真正的错误,因此您无法这样做。

如果在单个包(即package main)中有多个 .go 文件,则只能有一个 main() 函数。

您应该使用 go build 将应用程序构建为可执行二进制文件。 go run 是一种快速的“hack”用于测试单个文件,而不是完整的程序。

您的选项:

  1. 将它们放在同一个包中并使用go build
  2. 将您的“程序”拆分成单独的包。例如:$GOPATH/src/mypkg1$GOPATH/src/mypkg2
  3. 使用脚本语言。

我也建议阅读如何编写Go代码以管理软件包。


1
选项1是我喜欢的,这也是官方Go讲解中推荐的做法,即将.go文件放在同一个文件夹中。请参见官方讲解bestpractices here以及其他存储库中的讲解。但是,每次将这些文件保存在同一个文件夹中时,VIM Syntastic都会发出警告。这就是我所要求的。我认为应该有一种功能来抑制警告,对吧?我们知道在这种情况下这不是错误。 - user2647545
@user2647545 这些是示例程序。正如您所注意到的,它们都是 package main,但每个都有 main() 块,因为它们旨在独立运行。那个仓库有点误导(不幸的是)。只需将它们拆分到单独的文件夹中即可。如果您真的必须更改某些内容,请在 Syntastic GitHub 仓库 上提出问题并询问维护者。 - elithrar

3
原因是,在一个包中只能有一个主函数。

2

如果您正在使用vs code。

请关闭扩展程序go。

问题已解决。


1
即使它显示错误,您仍可以运行"go run"命令来测试/运行该文件。
$ go run file.go

1

我正在学习Go语言,将许多小的“func main”文件放在同一个目录中并尝试每个文件很方便,但希望消除“在此块中重复声明main”的警告。


0
如果你使用vim-go插件,你可以将下面的代码添加到你的.vimrc文件中。
let mapleader = ","    
autocmd FileType go nmap <Leader>rs  :<C-u>GoRun %<cr>

只需输入 ,rs, 即可获得结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接