Debugging Golang调试器未运行

Debugging Golang调试器未运行,debugging,go,visual-studio-code,delve,Debugging,Go,Visual Studio Code,Delve,我正在尝试使用Go设置VS代码,但在附加调试器时出错。因为我对VS代码是全新的,所以我没有关于原因的线索 我已安装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

我正在尝试使用Go设置VS代码,但在附加调试器时出错。因为我对VS代码是全新的,所以我没有关于原因的线索

我已安装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
代码:

这些都很有帮助,非常感谢

这让我觉得我的项目组织有问题。我有一个项目,有一堆可重用的包。我不想为每个包创建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 tour的第一页中介绍:

程序开始在包
main
中运行

以及在规范中:

一个完整的程序是通过将一个称为主程序包的未导入程序包与它导入的所有程序包进行传递链接而创建的。主包必须具有包名
main
,并声明一个不带参数且不返回值的函数
main


正如错误所暗示的,您只能调试
main
包(名为
main
的包)-具体地说,因为您只能运行
main
包。在Go中,二进制文件的起点是名为
main
的包中名为
main()
的函数。在代码中有一个名为
main()
的函数,但它位于名为
email
的包中,该包无法内置到程序中,因此无法调试

这将在Go tour的第一页中介绍:

程序开始在包
main
中运行

以及在规范中:

一个完整的程序是通过将一个称为主程序包的未导入程序包与它导入的所有程序包进行传递链接而创建的。主包必须具有包名
main
,并声明一个不带参数且不返回值的函数
main


错误是因为您正在尝试调试非主包。如果您有使用main函数调试文件的设置,请从主软件包调试该文件。否则,您可以创建用于调试整个包的设置。但是对于您的问题,只需将包名称更改为

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": {}
}

错误是因为您正在尝试调试非主包。如果您有使用main函数调试文件的设置,请从主软件包调试该文件。否则,您可以创建用于调试整个包的设置。但是对于您的问题,只需将包名称更改为

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是的,它的结构是正确的。只需始终为功能的不同部分添加一个包,例如,您想要创建一个发送电子邮件的功能,或者假设您想要创建一个处理数据库查询的包。谢谢。“程序”:“${workspaceRoot}”为我工作。之前是“程序”:“${fileDirname}”非常感谢,你是对的。你让我觉得我对我的回购协议有误解。我在原来的帖子中添加了一个关于我如何设置回购协议的问题,可能想知道是否有更好的方法来实现它。@mornindew是的,它的结构是正确的。只需始终为功能的不同部分添加一个包,例如,您想要创建一个发送电子邮件的功能,或者假设您想要创建一个处理数据库查询的包。谢谢。“程序”:“${workspaceRoot}”为我工作。之前是“程序”:“${fileDirname}”