Отладчик Golang не работает

Я пытаюсь настроить 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

Это неправильно структурировано? Есть ли рекомендуемый способ сделать это?

Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
0
0
4 339
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как следует из ошибки, вы можете отлаживать только пакет 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 main and declare a function main that 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 30.08.2018 18:42

@mornindew да, он правильно структурирован. просто всегда добавляйте пакет для другой части функциональности, например, вы хотите создать функциональность для отправки электронной почты или предположим, что вы хотите создать пакет для обработки запросов к базе данных.

Himanshu 30.08.2018 18:42

Спасибо. "program": "$ {workspaceRoot}" у меня сработало. Раньше это была программа: "$ {fileDirname}"

Prateek Bhuwania 19.06.2019 19:24

Другие вопросы по теме