写点什么

Go 语言开发工具 LiteIDE

  • 2013-02-18
  • 本文字数:5941 字

    阅读完需:约 19 分钟

Go 语言最初在 2009 年 11 月对外公布,在 2011 年 3 月 16 日发布第一个 release,第一个正式版本 Go1 于 2012 年 3 月 28 日推出。在 Go 语言的正式版本推出后,Eclipse、IntelliJ IDEA、vim、emacs、gedit、SublimeText2、Textmate、Textpad、SciTE、Notepad++ 等 IDE 和编辑器开始纷纷有了各自的 Go 语言插件。

LiteIDE 是一款专为 Go 语言开发而设计的跨平台轻量级集成开发环境(IDE),基于 Qt 开发,支持 Windows、Linux 和 Mac OS X 平台。LiteIDE 的第一个版本发布于 2011 年 1 月初,是最早的面向 Go 语言的 IDE 之一。到 2013 年 1 月为止,LiteIDE 已经发布到版本 X16。

LiteIDE 主要特点

  • 支持主流操作系统
    • Windows
    • Linux
    • MacOS X
  • Go 编译环境管理和切换
    • 管理和切换多个 Go 编译环境
    • 支持 Go 语言交叉编译
  • 与 Go 标准一致的项目管理方式
    • 基于 GOPATH 的包浏览器
    • 基于 GOPATH 的编译系统
    • 基于 GOPATH 的 Api 文档检索
  • Go 语言的编辑支持
    • 类浏览器和大纲显示
    • Gocode(代码自动完成工具) 的完美支持
    • Go 语言文档查看和 Api 快速检索
    • 代码表达式信息显示 F1
    • 源代码定义跳转支持 F2
    • Gdb 断点和调试支持
    • gofmt 自动格式化支持
  • 其他特征
    • 支持多国语言界面显示
    • 完全插件体系结构
    • 支持编辑器配色方案
    • 基于 Kate 的语法显示支持
    • 基于全文的单词自动完成
    • 支持键盘快捷键绑定方案
    • Markdown 文档编辑支持
      • 实时预览和同步显示
      • 自定义 CSS 显示
      • 可导出 HTML 和 PDF 文档
      • 批量转换 / 合并为 HTML/PDF 文档

下面,LiteIDE 的作者 visualfc 将介绍 LiteIDE 的安装配置,并展示一个使用 LiteIDE 开发 Go 语言应用的示例。

安装配置

首先需要安装好 Go 语言,Go 语言的项目地址是 http://code.google.com/p/go ,可以下载二进制文件或通过源码自行编译,按 Go 文档配置好 Go 开发环境。根据需要可以选择安装 Gocode,以支持 Go 语言输入自动完成, go get -u github.com/nsf/gocode。

LiteIDE 的下载地址为 http://code.google.com/p/golangide/downloads/list , 根据操作系统下载 LiteIDE 对应的压缩文件直接解压即可使用。

运行 LiteIDE, 根据当前系统切换和配置 LiteIDE 当前使用的环境变量。以 Windows 操作系统,64 位 Go 语言为例,工具栏的环境配置中选择 win64,点编辑环境,进入 LiteIDE 编辑 win64.env 文件

复制代码
GOROOT=c:\go
GOBIN=
GOARCH=amd64
GOOS=windows
CGO_ENABLED=1
PATH=%GOBIN%;%GOROOT%\bin;%PATH%
。。。

将其中的 GOROOT=c:\go 修改为当前 Go 安装路径,存盘即可,如果有 MinGW64,可以将 c:\MinGW64\bin 加入 PATH 中以便 go 调用 gcc 支持 CGO 编译。

如果当前系统为 Linux 操作系统,64 位 Go 语言,则在工具栏的环境配置中选择 linux64,点编辑环境,进入 LiteIDE 编辑 linux64.env 文件

复制代码
GOROOT=$HOME/go
GOBIN=
GOARCH=amd64
GOOS=linux
CGO_ENABLED=1
PATH=$GOBIN:$GOROOT/bin:$PATH
。。。

将其中的 GOROOT=$HOME/go 修改为当前 Go 安装路径,存盘即可。

配置 GOPATH 设置,Go 语言的工具链使用 GOPATH 设置,是 Go 语言开发的项目路径列表,在命令行中输入 go help gopath 快速查看 GOPATH 文档 (在 LiteIDE 中也通过可以 Ctrl+, 调出命令输入)。在 LiteIDE 中可以方便的查看和设置 GOPATH。通过菜单-查看-GOPATH 设置,可以查看系统中已存在的 GOPATH 列表,同时可根据需要添加项目目录到自定义 GOPATH 列表中。

使用 LiteIDE 开发一个简单的 Go 语言应用示例

项目简介

我们的目标是实现一个计算斐那契数列 (Fibonacci) 的程序,主程序为 fibutil,这是一个简单的命令行程序,算法库为 fibutil/fib,以包 (Package) 的形式提供,并实现 fib 包的相关测试文件和函数示例文档,最后实现交叉编译。

建立项目结构

我们先设置 GOPATH,菜单-查看-设置 GOPATH,将 f:\goproj 添加到自定义 GOPATH 中。首先使用向导建立 fibutil 项目,模板选择 Go1 Command Project,GOPATH 目录选择 f:\goproj,项目名称添写 fibutil 确定后并加载 fibutil 项目,这将自动生成并加载一个简单的 hello world 项目。然后使用向导建立 fibutil/fib 项目,模板使用 Go Package Project,项目名称添写 fibutil/fib,确定但不需要加载 fib 项目,直接在 fibutil 项目工作即可,如上图中项目窗口所示。与 Go 语言标准一致,在 LiteIDE 中项目就是目录,如果不使用向导而直接在 GOPATH/src 下建立上述目录和文件,效果是完全一样的。

Fibonacci 数列规律

数列列表:

复制代码
0 1 1 2 3 5 8 13 21 34 55 89 144 ...
... -21 13 -8 53 21 1 0 1 1 2 3 5 8 13 21

数列规律:

编写 fib 函数

项目窗口中双击 fib.go 并编辑,先编写使用 int64 计算 Fib 的函数 Fibm 和 Fibm2,分别以非递归方式和递归方式来实现,代码如下:

复制代码
// 非递归方式实现 Fibonacci 算法
func Fibm(n int64) int64 {
if n == 0 {
return 0
}
var i, a, b int64
b = 1
if n < 0 {
n = -n
if n%2 == 0 {
b = -1
}
}
for i = 2; i <= n; i++ {
a, b = b, a+b
}
return b
}
// 递归方式实现 Fibonacci 算法
func Fibm2(n int64) int64 {
if n < 0 {
if n%2 == 0 {
return _Fibm2(-n, 0, -1)
} else {
return _Fibm2(-n, 0, 1)
}
}
return _Fibm2(n, 0, 1)
}
func _Fibm2(n, a1, a2 int64) int64 {
if n == 0 {
return a1
}
return _Fibm2(n-1, a2, a1+a2)
}

注意一点,Fibm2 递归方式实现中是通过辅助函数 _Fibm2 来确保正确的尾调用。函数上方的注释会自动添加到文档中。

编写测试

接下来编写测试文件,Go 语言的测试文件约定命名为 xxx_test.go,测试文件的 Package 有以下两种命名方式:

复制代码
package fib // 称为 Test 方式,可以直接使用 fib 包内函数
package fib_test // 称为 XTest 方式, 因为包名与 fib 不同,必须使用 import "fibutil/fib"

测试函数约定命名为 TestXXX,性能测试函数约定命名为 BenchmarkXXX。 在项目窗口 fib 目录上右键新建文件 fib_test.go 并编辑,输入以下代码:

复制代码
package fib
import (
"testing"
)
func TestFibm(t *testing.T) {
ar := []int64{0, 1, 1, 2, 3, 5, 8, 13, 21}
for i := 0; i < len(ar); i++ {
if ar[i] != Fibm(int64(i)) {
t.Fatalf("%d, %d != %d", i, ar[i], Fibm(int64(i)))
}
}
ar1 := []int64{0, 1, -1, 2, -3, 5, -8, 13, -21}
for i := 0; i < len(ar1); i++ {
if ar1[i] != Fibm(int64(-i)) {
t.Fatalf("%d, %d != %d", -i, ar1[i], Fibm(int64(-i)))
}
}
}
func TestFibm2(t *testing.T) {
。。。

LiteIDE 在保存时会自动格式化源码,现在点击工具栏上的测试按钮(Ctrl+T)进行测试(等同于 go test),如果测试通过则显示

复制代码
PASS
ok fibutil/fib 0.036s

如果测试不能通过,则显示相应的错误信息,比如我们将测试函数 TestFibm 中数字 21 修改为 22,重新测试会显示错误

复制代码
--- FAIL: TestFibm (0.00 seconds)
fib_test.go:11: 8, 22 != 21
FAIL
exit status 1
FAIL fibutil/fib 0.035s

双击错误行 fib_test.go:11: 8, 22 != 21 则跳转到编辑器对应行,修改后重新测试,直到测试通过。

性能测试

我们可以通过性能测试函数来对 Fib 算法的递归和非递归实现性能进行直观比较,在 fib_test.go 文件中输入以下代码并保存。

复制代码
func BenchmarkFibm(b *testing.B) { for i := 0; i < b.N; i++ { Fibm(90) } }
func BenchmarkFibm2(b *testing.B) {
。。。

使用快捷键 Ctrl+, 调出文件系统的命令窗口输入 go test -bench=. 回车执行,结果如下:

复制代码
PASS
BenchmarkFibm 5000000 358 ns/op
BenchmarkFibm2 5000000 513 ns/op
ok fibutil/fib 5.286s

从性能测试结果中,我们可以看到非递归方式效率优于递归实现方式。

支持大数操作

我们注意到,Fibm 函数使用 int64 运算,意味着 Fibm 函数最大只能支持到 92,可以在 LiteIDE 中查找一下 Go 语言标准库中是否提供了大数计算实现,在 LiteIDE 侧边栏的 Golang 文档窗口中输入 big 进行检索,显示如下列表:

复制代码
math/big
math/big.NewInt
math/big.Int
math/big.Abs
。。。

从名称上可以判断 math/big.Int 支持大数操作,双击 math/big.Int 在 LiteIDE 中将直接打开 math/big 文档并同时定位到 big.Int 函数文档上。

现在使用 big.Int 编写支持大数操作的 Fib 函数和使用矩阵求解的 FastFib 函数,首先加入 import math/big, 函数代码如下:

复制代码
// big.Int 实现 Fibonacci 算法
func Fib(n int64) *big.Int {
if n == 0 {
return big.NewInt(0)
}
a, b, c := big.NewInt(0), big.NewInt(1), big.NewInt(0)
if n < 0 {
n = -n
if n%2 == 0 {
b.SetInt64(-1)
}
}
for i := int64(2); i <= n; i++ {
c.Set(a)
a.Set(b)
b.Add(b, c)
}
return b
}
// 使用矩阵求解 Fibonacci 算法
func FastFib(n int64) *big.Int {
。。。
// big.Int 实现 Fibonacci 列表
func FibList(n1,n2 int64) []string {
。。。

同时在 fib_test.go 文件中编写 Fib 函数相应的测试代码和性能测试代码,性能测试结果如下:

复制代码
PASS
BenchmarkFibm 5000000 359 ns/op
BenchmarkFibm2 5000000 513 ns/op
BenchmarkFib 100000 28878 ns/op
BenchmarkFastFib 50000 36354 ns/op
BenchmarkFib200 50000 65398 ns/op
BenchmarkFastFib200 50000 47926 ns/op
BenchmarkFib1000 5000 350344 ns/op
BenchmarkFastFib1000 20000 78159 ns/op
ok fibutil/fib 21.607s

可以看到 big.Int 要比 int64 慢许多,支持大数操作的 Fib 的效率为 O(N),FastFib 效率为 O(log(N)), 在 N 较大时对比非常明显。

编写 Fib 函数代码示例

在项目窗口 fib 目录上右键菜单可以查看 fib 包的 GODOC 文档,我们也可以为文档加入函数示例, 方法如下, 项目窗口 fib 目录右键新建文件 example_test.go,输入以下代码:

复制代码
package fib
import (
"fmt"
)
func ExampleFibList() {
fmt.Println(FibList(-10, 10))
// Output: [-55 34 -21 13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13 21 34 55]
}

函数 FibList 的示例名称约定为 ExampleFibList,如果有标准输出,则使用 // Output: 来标识输入,测试时会测试 ExampleFibList 的输出是否正确。先运行测试看是否通过测试,右键查看 GODOC 文档时就会看到 Fib 函数的这个代码示例了。

编写 fibutil 主程序

接下来将编写 fibutil 命令行程序,在 fibutil 项目窗口中双击 main.go 进入编辑。在源码中输入 import fibutil/fib 加入包引用,然后按编译菜单-Get 按钮(对应于按 Ctrl+, 输入 go get . 并回车),这样会自动安装 fibutil 需要的包到 pkg 目录中,以支持 Gocode 自动输入完成,在编辑过程中输入 fib. 则会自动显示包函数提示。代码如下:

复制代码
package main
import (
"fibutil/fib"
"fmt"
"os"
"strconv"
)
func main() {
switch len(os.Args) {
case 2:
n, err := strconv.ParseInt(os.Args[1], 10, 64)
if err == nil {
fmt.Println(fib.FastFib(n))
return
}
case 3:
n1, e1 := strconv.ParseInt(os.Args[1], 10, 64)
n2, e2 := strconv.ParseInt(os.Args[2], 10, 64)
if e1 == nil && e2 == nil {
fmt.Println(fib.FibList(n1, n2))
return
}
}
fmt.Fprintf(os.Stderr, "%s, fibonacci number util\n\tfibutil n\t:fibonacci number\n\tfibutil n1 n2\t:fibonacci number list\n", os.Args[0])
}

在编辑区的 fib.Fib 上按 F1 会显示 fib.Fib 函数信息,如果按 F2 则会直接跳转到 fib.Fib 源码定义处,这样可以很方便的浏览 Go 源代码。现在点击编译运行(Ctrl+R)开始编译并执行 fibutil 程序,可以在工具栏的编译配置的 TARGETARGS 中输入 -10 10,配置系统与 goproj/src/fibutil 目录关联在一起,再次编译并执行时,fibutil 程序会带参数运行(也可以 Ctrl+, 通过命令行 fibutil -10 10 执行),输出如下:

复制代码
[-55 34 -21 13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13 21 34 55]

调试

Go 语言编译器 gc 生成 DWARF 格式调试信息,gdb7.1 以上可以很好的调试 Go 语言,LiteIDE 集成了图形化调试功能,提供断点设置、显示变量值、函数调用栈、添加变量监视等功能,同时支持调试控制台直接输入 gdb 调试命令。在对 Go 源程序调试时,如果需要禁用优化和内联,可以使用工具栏编译配置-编译自定义-BUILDARGS 中输入 -gcflags “-N -l” 重新编译后调试即可,在菜单-选项-LiteDebug 中可以选择调试前重编译,这样每次调试时会自动重新编译。

交叉编译

Go 语言支持多平台交叉编译,我们准备将 fibutil 交叉编译为 Linux-amd64 目标。首先要编译 Go 源码以创建目标平台所需要的包和工具, 进入 cmd 命令行执行:

复制代码
> set GOOS=linux
> set GOARCH=amd64
> set CGO_ENABLED=0
> cd c:\go\src
> all.bat

注意的是 Go1.0x 版本同一份源码仅支持一个本地平台和一个交叉编译平台,go 最新源码 hg-tip 版本则没有这个限制。

编译好目标平台所需要的包和工具后,在 LiteIDE 中切换环境配置为对应的交叉编译环境,即 cross-linux64, 编辑配置文件,修改确认 GOROOT 为交叉编译平台的 GOROOT 存盘即可。打开 fibutil 项目内的 main.go 文件,现在使用编译按钮则会编译出 Linux-amd64 平台的目标 fibutil,将生成的 fibutil 二进制文件复制到 Linux-amd64 上即可正确运行,在 LiteIDE 中通过切换不同的配置文件,可随时编译为本地可执行文件和交叉编译目标平台可执行文件。

编写 README

最后,我们可以为 fibutil 写一份 README 简介,选择 Markdown 书写格式,LiteIDE 支持 Markdown 编辑和实时预览,也可以转换输出为 Html/PDF 文档。在 fibutil 项目右键新建文件 README.md 并编辑,写上项目的简介和使用说明,在 Html 预览窗口中可以实时预览,通过切换不同的 CSS 来显示不同的预览效果。本文就是通过 LiteIDE 的 Makdown 编辑器编辑完成。

本文代码

fibutil 源代码可以从 https://github.com/visualfc/fibutil 下载,可以使用 go get 安装: go get -v github.com/visualfc/fibutil。 github 网站上的代码与本文示例代码区别在于于引用位置不同,即在 fibutil.go 文件中使用 import github.com/visualfc/fibutil/fib 替代 import fibutil/fib

关于作者

visualfc,非计算机专业毕业的狂热程序员,擅长 C++、Lua、Go 等语言,热衷于开源软件,业余时间开发了 WTL 可视化开发插件 VisualFC( http://code.google.com/p/visualfc )、基于 Qt 的跨平台轻量级 Go 语言集成开发环境 LiteIDE( http://code.google/p/golangide ),他的邮件是 visualfc@gmail.com。

2013-02-18 01:3572562

评论

发布
暂无评论
发现更多内容

速卖通API接口深度解析:商品详情获取与关键词搜索商品实战指南

代码忍者

速卖通API接口

京东商品详情API接口指南(Python篇)

tbapi

京东API接口 京东商品详情接口

AutoGen入门-让两个AI自行聊天完成任务

不在线第一只蜗牛

人工智能 AI

RabbitMQ 可观测性最佳实践

观测云

RabbitMQ

英伟达世界基础模型 Cosmos,教 AI 理解物理世界;阿里通义与雷鸟合作推出 AI 眼镜丨 RTE 开发者日报

声网

承载AI的云南花卉,正在盛开

脑极体

AI

什么是AI Agent?——最简单的解释

TechubNews

#人工智能

年末福利:距离 KaiwuDB 官方认证,仅差一步之遥!

KaiwuDB

数据库认证

从零开始使用Univer Clipsheet构建自己的爬虫插件

梦数技术团队

JavaScript GitHub 前端 爬虫工具 Chrome Extension

【场景驱动】企业的哪些重复性任务,最适合用Coze循环节点来解决?——慢慢学AI146

AI决策者洞察

#人工智能 Prompt

枫清科技高雪峰: Data-Centric新范式开启,知识引擎+大模型双轮驱动企业智能化

Fabarta

#人工智能 #大模型 生成式 AI 应用 企业 AI 应用 大模型应用

研发效能中的AI度量与度量AI

思码逸研发效能

研发效能 研发效能度量 AI辅助 思码逸

焱融全闪 F9000X 性能再创新高,全面释放大规模 AI 计算效能

焱融科技

人工智能 大模型 智算中心 全闪存储

分享一次面试经历

王中阳Go

面试

GSCF收购IBM Deutschland Kreditbank GmbH

财见

哈马德国际机场报告2024年创纪录

财见

走出群山,长赛道“攀登者”vivo

脑极体

AI

MSE Nacos 2.3.2.0 发布,性能最多提升三倍,支持操作审计等安全特性

阿里巴巴云原生

阿里云 云原生

JVM实战—OOM的生产案例

不在线第一只蜗牛

JVM

基于LangChain手工测试用例生成工具

测试人

软件测试

数据服务 | 新一代财务共享从流程优化到数据赋能的转型之旅

用友智能财务

业务 财务 财会

亚马逊API接口深度解析:商品详情获取与关键词搜索商品实战指南

代码忍者

亚马逊商品详情API

小红书API接口深度解析:如何高效获取笔记详情数据并附简短代码示例

代码忍者

小红书API接口

基于 Flink 进行增量批计算的探索与实践

Apache Flink

大数据 flink 批计算

【全方位解析】企业如何通过提示词工程优化AI输出,提升市场竞争力—慢慢学AI045

AI决策者洞察

#人工智能 Prompt

Go语言开发工具LiteIDE_Google_visualfc_InfoQ精选文章