Я пытаюсь настроить VS Code с помощью Go, но при подключении отладчика получаю сообщение об ошибке. Поскольку я новичок в VS Code, у меня нет никаких подсказок, почему.
Я установил отладчик delve:
go get -u github.com/derekparker/delve/cmd/dlv
delv -v
delv 9.11.3-1ubuntu1.1-Ubuntu
Я получаю эту ошибку, когда пытаюсь прикрепить отладчик к очень простому файлу golang:
API server listening at: 127.0.0.1:2345
time = "2018-08-30T09:39:57-06:00" level=info msg = "launching process with args: [/home/craig/Documents/GoLang/src/github.com/mornindew/sharedPackages/email/debug]" layer=debugger
Can not debug non-main package
Process exiting with code: 1
Код:
package email
import "fmt"
// SendEmail - Sends The email
func SendEmail() {
}
func main() {
fmt.Println("Hello World!")
i := 101
fmt.Println(i)
}
Все это очень помогает, большое вам спасибо.
Это заставляет меня думать, что у меня проблема в моей проектной организации. У меня есть проект, в котором есть много многоразовых пакетов. Я не хотел создавать репозиторий github для каждого отдельного пакета. По сути:
package1
-- package1.go
-- package1_test.go
package2
-- package2.go
-- package2_test.go
...
package10
-- package10.go
-- package10_test.go
Это неправильно структурировано? Есть ли рекомендуемый способ сделать это?

Как следует из ошибки, вы можете отлаживать только пакет main (пакет с именем main) - в частности, потому что вы можете только запустить для пакета main. В Go отправной точкой двоичного файла является функция main() в пакете main. В вашем коде есть функция под названием main(), но она находится в пакете под названием email, который не может быть встроен в программу и, следовательно, не может быть отлажен.
Это описано на первой странице Go-тура: https://tour.golang.org/basics/1
Programs start running in package
main.
Как и в спецификации: https://golang.org/ref/spec#Program_execution
A complete program is created by linking a single, unimported package called the main package with all the packages it imports, transitively. The main package must have package name
mainand declare a functionmainthat takes no arguments and returns no value.
Ошибка возникает из-за того, что вы пытаетесь отладить не основной пакет. Выполните отладку файла из основного пакета, если у вас есть настройки для отладки файла с помощью основной функции. В противном случае вы можете создать настройку для отладки всего пакета. Но для вашей проблемы просто измените имя пакета как
package main
import "fmt"
// SendEmail - Sends The email
func SendEmail() {
}
func main() {
fmt.Println("Hello World!")
i := 101
fmt.Println(i)
}
или Запустите отладчик из основного пакета с помощью функции main. Для отладки всего рабочего пространства измените настройки в launch.json как:
{
"name": "Remote",
"type": "go",
"request": "launch",
"mode": "remote",
"remotePath": "${workspaceRoot}",
"port": 2345,
"host": "127.0.0.1",
"program": "${workspaceRoot}",
"env": {}
}
@mornindew да, он правильно структурирован. просто всегда добавляйте пакет для другой части функциональности, например, вы хотите создать функциональность для отправки электронной почты или предположим, что вы хотите создать пакет для обработки запросов к базе данных.
Спасибо. "program": "$ {workspaceRoot}" у меня сработало. Раньше это была программа: "$ {fileDirname}"
Большое спасибо, вы были правы. Вы заставили меня подумать, что я неправильно сконфигурировал свое репо. Я добавил вопрос к исходному сообщению о том, как я настраиваю свое репо, и, возможно, задаюсь вопросом, есть ли лучший способ сделать это.