LiteIDE调试Go语言需要安装GDB
创新互联成立与2013年,是专业互联网技术服务公司,拥有项目网站建设、网站设计网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元江门做网站,已为上家服务,为江门各地企业和个人服务,联系电话:18982081108
1.先解决brew不能使用的问题
cd /usr/local/Library
git pull origin master
brew update
brew prune
brew doctor
参考:
2.用Homebrew 安装 gdb
(1)
# brew tap homebrew/dupes
(2)
# brew install gdb
(3)有可能提示:
Warning: No developer tools installed.
You should install the Command Line Tools.
Run `xcode-select --install` to install them.
那就先安装the Command Line Tools.
# xcode-select --install
3.给gdb制作证书并授权:
如果没有证书,会出现如下提示:
(gdb) run
Starting program: /Users/wenke/go/src/gdb/main
Unable to find Mach task port for process-id 18420: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
配置环境
在OSX系统上很容易安装GO的可执行文件:
brew install go
虽然Java或Ruby (或者任何我知道的语言) 可以在本地文件系统的任何地方使用命令,,但是Go项目必须使用单一专用的地址,,并且在$GOPATH环境变量下可用。
第 1 段(可获 1.54 积分)
R e; 7个月前
创建项目对于Logstash插件,Beats项目可以从模板创建。官方文档的说明十分简单。鉴于Go对文件系统上的位置的严格要求,只需按照以下说明生成一个新的即可使用的Go项目。默认模板代码将在控制台中重复发送带增量计数器的事件:./redditbeat -e -d "*"
2016/12/13 22:55:56.013362 beat.go:267: INFO
Home path: [/Users/i303869/projects/private/go/src/github.com/nfrankel/redditbeat]
Config path: [/Users/i303869/projects/private/go/src/github.com/nfrankel/redditbeat]
Data path: [/Users/i303869/projects/private/go/src/github.com/nfrankel/redditbeat/data]
Logs path: [/Users/i303869/projects/private/go/src/github.com/nfrankel/redditbeat/logs]
2016/12/13 22:55:56.013390 beat.go:177: INFO Setup Beat: redditbeat; Version: 6.0.0-alpha1
2016/12/13 22:55:56.013402 processor.go:43: DBG Processors:
2016/12/13 22:55:56.013413 beat.go:183: DBG Initializing output plugins
2016/12/13 22:55:56.013417 logp.go:219: INFO Metrics logging every 30s
2016/12/13 22:55:56.013518 output.go:167: INFO Loading template enabled. Reading template file:
/Users/i303869/projects/private/go/src/github.com/nfrankel/redditbeat/redditbeat.template.json
2016/12/13 22:55:56.013888 output.go:178: INFO Loading template enabled for Elasticsearch 2.x. Reading template file:
/Users/i303869/projects/private/go/src/github.com/nfrankel/redditbeat/redditbeat.template-es2x.json
2016/12/13 22:55:56.014229 client.go:120: INFO Elasticsearch url:
2016/12/13 22:55:56.014272 outputs.go:106: INFO Activated elasticsearch as output plugin.
2016/12/13 22:55:56.014279 publish.go:234: DBG Create output worker
2016/12/13 22:55:56.014312 publish.go:276: DBG No output is defined to store the topology.
The server fields might not be filled.
2016/12/13 22:55:56.014326 publish.go:291: INFO Publisher name: LSNM33795267A
2016/12/13 22:55:56.014386 async.go:63: INFO Flush Interval set to: 1s
2016/12/13 22:55:56.014391 async.go:64: INFO Max Bulk Size set to: 50
2016/12/13 22:55:56.014395 async.go:72: DBG create bulk processing worker (interval=1s, bulk size=50)
2016/12/13 22:55:56.014449 beat.go:207: INFO redditbeat start running.
2016/12/13 22:55:56.014459 redditbeat.go:38: INFO redditbeat is running! Hit CTRL-C to stop it.
2016/12/13 22:55:57.370781 client.go:184: DBG Publish: {
"@timestamp": "2016-12-13T22:54:47.252Z",
"beat": {
"hostname": "LSNM33795267A",
"name": "LSNM33795267A",
"version": "6.0.0-alpha1"
},
"counter": 1,
"type": "redditbeat"
}
第 2 段(可获 0.73 积分)
R e; 7个月前
关于命令行参数:-e记录到标准err,而-d“*”启用所有调试选择器。有关参数的完整列表,请键入./redditbeat --help。编码Go代码位于.go文件中(令人惊讶...)在$ GOPATH / src文件夹的项目子文件夹中。配置类型第一个有趣的文件是config / config.go,它定义了一个结构来声明Beat的可能参数。至于前面的Logstash插件,让我们添加一个subreddit参数,并设置它的默认值:type Config struct {
Period time.Duration `config:"period"`
Subreddit string `config:"subreddit"`
}
var DefaultConfig = Config {
Period: 15 * time.Second,
Subreddit: "elastic",
}
第 3 段(可获 0.89 积分)
R e; 7个月前
Beater TypeBeat本身的代码在beater / redditbean.go中找到。默认模板为Beat和三个函数创建一个struct:Beat构造函数—用来读取配置: func New(b *beat.Beat, cfg *common.Config) (beat.Beater, error) { ... }
Run 函数- 需要覆盖Beat的主要功能: func (bt *Redditbeat) Run(b *beat.Beat) error { ... }
Stop 函数管理优雅关闭: func (bt *Redditbeat) Stop() { ... }
Note 1:在Go中没有明确的接口实现。实现了 interface 中的所有方法,即创建一个隐式继承关系. 出于写文档的目的,这是 Beater 接口:type Beater interface {
Run(b *Beat) error
Stop()
}
第 4 段(可获 0.93 积分)
R e; 7个月前
因此,由于Beat结构实现了Run和Stop,它是一个Beater。Note 2: 在Go中没有类的概念,所以方法不能在一个具体类型上声明。但是,它存在扩展函数的概念:可以添加行为到一个类型(在单个包中)的函数。它需要声明receiver 类型:这是在fun关键字和函数名之间完成的 - 这里是指Redditbeat类型(或者更准确地说,是一个指向Redditbeat类型的指针,但是这里有一个隐式转换)。构造函数和Stop函数可以保持不变,无论什么特性都应该在Run函数中。在这种情况下,功能是调用Reddit REST API并为每个Reddit帖子发送一条消息。
第 5 段(可获 1.59 积分)
R e; 7个月前
最终代码如下所示:func (bt *Redditbeat) Run(b *beat.Beat) error {
bt.client = b.Publisher.Connect()
ticker := time.NewTicker(bt.config.Period)
reddit := "" + bt.config.Subreddit + "/.json"
client := http.Client {}
for {
select {
case -bt.done:
return nil
case -ticker.C:
}
req, reqErr := http.NewRequest("GET", reddit, nil)
req.Header.Add("User-Agent", "Some existing header to bypass 429 HTTP")
if (reqErr != nil) {
panic(reqErr)
}
resp, getErr := client.Do(req)
if (getErr != nil) {
panic(getErr)
}
body, readErr := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if (readErr != nil) {
panic(readErr)
}
trimmedBody := body[len(prefix):len(body) - len(suffix)]
messages := strings.Split(string(trimmedBody), separator)
for i := 0; i len(messages); i ++ {
event := common.MapStr{
"@timestamp": common.Time(time.Now()),
"type": b.Name,
"message": "{" + messages[i] + "}",
}
bt.client.PublishEvent(event)
}
}
}
第 6 段(可获 0.09 积分)
R e; 7个月前
这里是对最重要的几部分的解释:line 4: 通过连接字符串创建Reddit REST URL,包括配置Subreddit参数。记住,它的默认值已在config.go文件中定义。line 5: 引用httpClient类型line 12: 创建新的HTTP请求。注意Go允许多个返回值。line 13: 如果没有设置标准请求头,Reddit的API将返回429状态码。line 14: Go标准错误不通过异常处理,而是随着常规返回值返回。根据Golang wiki:指示调用者的错误条件,应通过返回错误值来完成line 15: panic() 函数类似于在Java中抛出异常, 被处理时推到栈顶。 有关详细信息,请查看相关文档。line 17: 执行HTTP请求。line 21: 将响应主体读入字节数组。line 22: 关闭主体流。注意defer关键字:defer语句延迟函数的执行,直到环绕的函数返回。line 26: 创建整个响应主体字节数组的切片 - 对数组的一部分的引用。实质上,它删除了前缀和后缀以保持相关的JSON值。之后将字节数组解析成JSON。line 27: 分割切片以单独获取每个JSON片段。line 29: 将消息创建为简单的字典结构。line 34: 发送。
第 7 段(可获 3.11 积分)
R e; 7个月前
配置, 构建, 运行默认配置参数可以在项目根目录下的redditbeat.yml文件中找到。请注意,redditbeat.full.yml中列出了其他常见的Beat参数,以及相关注释。关于Beats的一个有趣的事情是,他们的消息可以直接发送到Elasticsearch或Logstash进行进一步处理。这在上述配置文件中配置。redditbeat:
period: 10s
output.elasticsearch:
hosts: ["localhost:9200"]
output.logstash:
hosts: ["localhost:5044"]
enabled: true
第 8 段(可获 0.78 积分)
R e; 7个月前
此配置片段将每10秒循环运行Run方法,并将消息发送到在localhost上运行的Logstash实例在端口5044上。这可以在运行Beat时被覆盖(见下文)。注意:为了使Logstash接受来自Beats的消息,必须安装Logstash Beat插件,并且必须为Beats配置Logstash的input:input {
beats {
port = 5044
}
}
要构建项目,请在项目的根目录中键入make。它将创建一个可以运行的可执行文件。./redditbeat -e -E redditbeat.subreddit=java
-E参数可以覆盖在的redditbeat.yml配置文件中找到的参数(见上文)。在这里,它设置subreddit读为“java”,而不是默认的“elastic”。
第 9 段(可获 1.3 积分)
R e; 7个月前
输出如下所示:2016/12/17 14:51:19.748329 client.go:184: DBG Publish: {
"@timestamp": "2016-12-17T14:51:19.748Z",
"beat": {
"hostname": "LSNM33795267A",
"name": "LSNM33795267A",
"version": "6.0.0-alpha1"
},
"message": "{
\"kind\": \"t3\", \"data\": {
\"contest_mode\": false, \"banned_by\": null,
\"domain\": \"blogs.oracle.com\", \"subreddit\": \"java\", \"selftext_html\": null,
\"selftext\": \"\", \"likes\": null, \"suggested_sort\": null, \"user_reports\": [],
\"secure_media\": null, \"saved\": false, \"id\": \"5ipzgq\", \"gilded\": 0,
\"secure_media_embed\": {}, \"clicked\": false, \"report_reasons\": null,
\"author\": \"pushthestack\", \"media\": null, \"name\": \"t3_5ipzgq\", \"score\": 11,
\"approved_by\": null, \"over_18\": false, \"removal_reason\": null, \"hidden\": false,
\"thumbnail\": \"\", \"subreddit_id\": \"t5_2qhd7\", \"edited\": false,
\"link_flair_css_class\": null, \"author_flair_css_class\": null, \"downs\": 0,
\"mod_reports\": [], \"archived\": false, \"media_embed\": {}, \"is_self\": false,
\"hide_score\": false, \"spoiler\": false,
\"permalink\": \"/r/java/comments/5ipzgq/jdk_9_will_no_longer_bundle_javadb/\",
\"locked\": false, \"stickied\": false, \"created\": 1481943248.0,
\"url\": \"\",
\"author_flair_text\": null, \"quarantine\": false,
\"title\": \"JDK 9 will no longer bundle JavaDB\", \"created_utc\": 1481914448.0,
\"link_flair_text\": null, \"distinguished\": null, \"num_comments\": 4,
\"visited\": false, \"num_reports\": null, \"ups\": 11
}
}",
"type": "redditbeat"
}
强大的跨平台编程能力
Bowery团队指出Go能很方便地在不同系统里进行程序编译,这是他们转入Go的重要原因之一。
作为开发平台,对Linux,Windows,OSX等常见操作系统提供支援是能否吸引开发者的基本要素。在Go中,开发者可以针对不同操作系统定义不同的文件来实现相同的功能函数。Bowery团队成员Larz在创建Prompt应用(命令行输入)时,就是借助Go而轻松实现了跨平台编译。而开发者要做的,就是设置好不同的环境变量。
快速部署
在Go平台中,从测试环境到真实环境的切换是非常便捷的,因为它无需额外的系统依赖。特别是对于Bowery提供给用户的命令行工具来说,用户无需安装Java,RVM或者NPM等工具便可正常运行。
并发处理
Node.js在并发处理方面处于劣势,仅有I/O程序或计时器运行在并发模式。因此如果希望打造一个快速响应的跨程序通讯系统,Go无疑是更好的选择。Go提供了低级别的并发处理基元,例如mutexes、wait groups等等。
整合测试框架
如果希望找到一个标准化的整合测试框架,不妨进入Go来体验一番,它内建了完整的测试包,免去了四处寻找的麻烦。如果想编写一个新的测试套件,只要把_test.go文件添加到相同的包里就可以了。有关Go测试的更多信息,请点击这里进行访问。
标准库
Go提供了标准库,标准库的好处是无需包含其他扩展库,从而能节省开发时间并且还提高了健壮性。
强大的开发者工作流工具
Go的工作区界面能帮助建立标准化的工作流,虽然这或许会压缩了开发的自由度,但得到的是一个结构化的有条理的工作区:该区有三个根目录,src用于放置源码包,pkg用于放置编译包,bin放置的是执行文件。把源码和依赖文件集中存储的好处是使团队成员都有一个相同的文档结构,而不会出现杂乱的文档情况。此外gofmt能以相同风格对代码进行格式化,这是一个非常实用的功能。所以一旦需要进行调试,只需集中精力解决当前问题而无需分心处理结构或风格等琐碎问题
1.1 Go 安装
Go的三种安装方式
Go有多种安装方式,你可以选择自己喜欢的。这里我们介绍三种最常见的安装方式:
Go源码安装:这是一种标准的软件安装方式。对于经常使用Unix类系统的用户,尤其对于开发者来说,从源码安装可以自己定制。
Go标准包安装:Go提供了方便的安装包,支持Windows、Linux、Mac等系统。这种方式适合快速安装,可根据自己的系统位数下载好相应的安装包,一路next就可以轻松安装了。**推荐这种方式**
第三方工具安装:目前有很多方便的第三方软件包工具,例如Ubuntu的apt-get、Mac的homebrew等。这种安装方式适合那些熟悉相应系统的用户。
最后,如果你想在同一个系统中安装多个版本的Go,你可以参考第三方工具GVM,这是目前在这方面做得最好的工具,除非你知道怎么处理。
Go源码安装
在Go的源代码中,有些部分是用Plan 9 C和ATT汇编写的,因此假如你要想从源码安装,就必须安装C的编译工具。
在Mac系统中,只要你安装了Xcode,就已经包含了相应的编译工具。
在类Unix系统中,需要安装gcc等工具。例如Ubuntu系统可通过在终端中执行sudo apt-get install gcc
libc6-dev来安装编译工具。
在Windows系统中,你需要安装MinGW,然后通过MinGW安装gcc,并设置相应的环境变量。
你可以直接去官网下载源码,找相应的goVERSION.src.tar.gz的文件下载,下载之后解压缩到$HOME目录,执行如下代码:
cd go/src
./all.bash
运行all.bash后出现"ALL TESTS PASSED"字样时才算安装成功。
上面是Unix风格的命令,Windows下的安装方式类似,只不过是运行all.bat,调用的编译器是MinGW的gcc。
如果是Mac或者Unix用户需要设置几个环境变量,如果想重启之后也能生效的话把下面的命令写到.bashrc或者.zshrc里面,
export GOPATH=$HOME/gopath
export PATH=$PATH:$HOME/go/bin:$GOPATH/bin
如果你是写入文件的,记得执行bash .bashrc或者bash
.zshrc使得设置立马生效。
如果是window系统,就需要设置环境变量,在path里面增加相应的go所在的目录,设置gopath变量。
当你设置完毕之后在命令行里面输入go,看到如下图片即说明你已经安装成功
图1.1 源码安装之后执行Go命令的图
如果出现Go的Usage信息,那么说明Go已经安装成功了;如果出现该命令不存在,那么可以检查一下自己的PATH环境变中是否包含了Go的安装目录。
关于上面的GOPATH将在下面小节详细讲解
Go标准包安装
Go提供了每个平台打好包的一键安装,这些包默认会安装到如下目录:/usr/local/go
(Windows系统:c:\Go),当然你可以改变他们的安装位置,但是改变之后你必须在你的环境变量中设置如下信息:
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
上面这些命令对于Mac和Unix用户来说最好是写入.bashrc或者.zshrc文件,对于windows用户来说当然是写入环境变量。
如何判断自己的操作系统是32位还是64位?
我们接下来的Go安装需要判断操作系统的位数,所以这小节我们先确定自己的系统类型。
Windows系统用户请按Win+R运行cmd,输入systeminfo后回车,稍等片刻,会出现一些系统信息。在“系统类型”一行中,若显示“x64-based
PC”,即为64位系统;若显示“X86-based PC”,则为32位系统。
Mac系统用户建议直接使用64位的,因为Go所支持的Mac OS X版本已经不支持纯32位处理器了。
Linux系统用户可通过在Terminal中执行命令arch(即uname
-m)来查看系统信息:
64位系统显示
x86_64
32位系统显示
i386
Mac 安装
访问下载地址,32位系统下载go1.4.2.darwin-386-osx10.8.pkg,64位系统下载go1.4.2.darwin-amd64-osx10.8.pkg,双击下载文件,一路默认安装点击下一步,这个时候go已经安装到你的系统中,默认已经在PATH中增加了相应的~/go/bin,这个时候打开终端,输入go
看到类似上面源码安装成功的图片说明已经安装成功
如果出现go的Usage信息,那么说明go已经安装成功了;如果出现该命令不存在,那么可以检查一下自己的PATH环境变中是否包含了go的安装目录。
Linux 安装
访问下载地址,32位系统下载go1.4.2.linux-386.tar.gz,64位系统下载go1.4.2.linux-amd64.tar.gz,
假定你想要安装Go的目录为 $GO_INSTALL_DIR,后面替换为相应的目录路径。
解压缩tar.gz包到安装目录下:tar zxvf go1.4.2.linux-amd64.tar.gz -C
$GO_INSTALL_DIR。
设置PATH,export PATH=$PATH:$GO_INSTALL_DIR/go/bin
然后执行go
图1.2 Linux系统下安装成功之后执行go显示的信息
如果出现go的Usage信息,那么说明go已经安装成功了;如果出现该命令不存在,那么可以检查一下自己的PATH环境变中是否包含了go的安装目录。
Windows 安装
访问Google Code 下载页,32
位请选择名称中包含 windows-386 的 msi 安装包,64 位请选择名称中包含 windows-amd64 的。下载好后运行,不要修改默认安装目录
C:\Go\,若安装到其他位置会导致不能执行自己所编写的 Go 代码。安装完成后默认会在环境变量 Path 后添加 Go 安装目录下的 bin 目录
C:\Go\bin\,并添加环境变量 GOROOT,值为 Go 安装根目录 C:\Go\ 。
验证是否安装成功
在运行中输入 cmd 打开命令行工具,在提示符下输入 go,检查是否能看到 Usage 信息。输入
cd %GOROOT%,看是否能进入 Go 安装目录。若都成功,说明安装成功。
不能的话请检查上述环境变量 Path 和 GOROOT 的值。若不存在请卸载后重新安装,存在请重启计算机后重试以上步骤。
第三方工具安装
GVM
gvm是第三方开发的Go多版本管理工具,类似ruby里面的rvm工具。使用起来相当的方便,安装gvm使用如下命令:
bash (curl -s -S -L )
安装完成后我们就可以安装go了:
gvm install go1.4.2
gvm use go1.4.2
也可以使用下面的命令,省去每次调用gvm use的麻烦: gvm use go1.4.2 --default
执行完上面的命令之后GOPATH、GOROOT等环境变量会自动设置好,这样就可以直接使用了。
apt-get
Ubuntu是目前使用最多的Linux桌面系统,使用apt-get命令来管理软件包,我们可以通过下面的命令来安装Go,为了以后方便,应该把
git mercurial 也安装上:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:gophers/go
sudo apt-get update
sudo apt-get install golang-stable git-core mercurial
homebrew
homebrew是Mac系统下面目前使用最多的管理软件的工具,目前已支持Go,可以通过命令直接安装Go,为了以后方便,应该把
git mercurial 也安装上:
brew update brew upgrade
brew install go
brew install git
brew install mercurial