VIM Go Syntastic: main переобъявлен

Плагин VIM Syntastic хорошо работает с файлом .go. Но иногда я хочу иметь несколько файлов go в одной папке, и каждый с методом main(), чтобы я мог go run xxx каждый файл (для презентации). Это вызовет ошибку при сохранении второго файла (prog2.go):

main redeclared in the block previous declaration at prog1.go

Как я могу сказать Syntastic игнорировать эти ошибки?

Обновление 1

Официальные доклады о Go, такие как «Шаблоны параллелизма в Go» Роба Пайка и «Двенадцать лучших практик Go» Франсеска Кампоя Флореса, помещают исходный файл в одну и ту же папку. Таким образом, этот вопрос касается не наилучшей практики запуска файла go, а того, как подавить или игнорировать это предупреждение.

Обновление 2

После того, как я зарегистрировал проблему здесь, автор ясно ответил на мой вопрос. Это как раз то, что мне было нужно. Спасибо за все.


person user2647545    schedule 03.03.2014    source источник


Ответы (6)


Вы не можете, потому что это настоящая ошибка.

Если у вас есть несколько файлов .go в одном пакете (например, package main), вы можете иметь только одну функцию main().

Вы должны использовать go build для сборки приложения в исполняемый двоичный файл. go run — это быстрый «хак» для тестирования отдельных файлов, а не полных программ.

Ваши варианты:

  1. Поместите их в один пакет и используйте go build.
  2. Разделите ваши «программы» на отдельные пакеты. например $GOPATH/src/mypkg1 и $GOPATH/src/mypkg2
  3. Используйте язык сценариев.

Я бы также посоветовал прочитать Как написать код Go, чтобы узнать, как управлять пакетами.

person elithrar    schedule 04.03.2014
comment
Вариант 1 — это то, что я предпочитаю, и это официальные переговоры Go, которые помещают файл .go в одну и ту же папку. Ознакомьтесь с рекомендациями по официальному обсуждению здесь и другие разговоры в репозитории. Но VIM Syntastic каждый раз будет предупреждать при сохранении этих файлов в одну и ту же папку. Это то, о чем я просил. Я думаю, должна быть функция для подавления предупреждения, верно? Мы знаем, что это не ошибка в этом состоянии. - person user2647545; 04.03.2014
comment
@ user2647545 Это примеры программ. Как вы заметите, все они package main, но каждый из них имеет main() блоков, потому что они предназначены для изолированного запуска. Это репо немного вводит в заблуждение (к сожалению). Просто разделите их на отдельные папки. Если вам действительно нужно что-то изменить, поднимите вопрос в Syntastic GitHub и спросите у мейнтейнера(ов). - person elithrar; 04.03.2014

Причина в том, что в пакете может быть только одна основная функция.

person Arul    schedule 07.05.2020

даже если он показывает ошибку, вы можете запустить команду go run, чтобы протестировать/запустить этот файл

$ go run file.go
person Abhishek D K    schedule 12.10.2018

если вы используете плагин vim-go, вы можете добавить следующее в свой .vimrc.

let mapleader = ","    
autocmd FileType go nmap <Leader>rs  :<C-u>GoRun %<cr>

Просто нажав ,rs, вы можете получить результат.

person bzd111    schedule 18.10.2018

Я учусь идти, и удобно поместить много небольших основных файлов func в один и тот же каталог и попробовать каждый из них, хотелось бы отключить «основной повторно объявленный в этом блоке»

person Lao Shaw    schedule 22.10.2020

Если вы используете vs code.

будьте добры выключите. расширение идет. проблема решена.

person Shah Vipul    schedule 31.05.2021