写点什么

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:3572845

评论

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

微博评论的高可用计算架构

sandywrh

2023年iOS App Store上架流程详解(上)

牛刀低代码开发实战—需求评审

牛刀专业低代码

低代码 低代码开发平台 牛刀低代码 低代码paas平台 java低代码

HDC.Cloud 2023|邂逅AI,华为云CodeArts铸就研发效能10倍提升

华为 华为云 华为开发者大会2023

2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同?

福大大架构师每日一题

福大大架构师每日一题

小巧玲珑的AVIF,你的网页图片换新装!

汽车之家客户端前端团队

免费试用商业智能工具,帮助您轻松选择BI工具

夜雨微澜

官宣!Databend Cloud 和青云科技达成合作

Databend

Docker学习路线5:在 Docker 中实现数据持久化

小万哥

Java c++ Go Docker 后端

H5页面秒开优化与实践

汽车之家客户端前端团队

给我五分钟!让你掌握React的Redux中间件原理

汽车之家客户端前端团队

LangChain 联合创始人下场揭秘:如何用 LangChain 和向量数据库搞定语义搜索

Zilliz

Milvus Zilliz #LangChain

24款绘画软件app推荐免费!手绘爱好者必备。

彭宏豪95

效率工具 软件推荐 科技 画图工具 绘图软件

突破:GGX(Golden Gate)发布悉尼测试网,跨链基础设施迈出重要一步

股市老人

白鲸开源WhaleScheduler完成阿里云PolarDB数据库产品生态集成认证

阿里云数据库开源

开源数据库 国产数据库 polarDB PolarDB-X PolarDB for PostgreSQL

牛刀专业低代码开发实战—招聘管理

牛刀专业低代码

低代码 低代码开发平台 起步牛刀低代码 牛刀低代码 牛刀专业低代码

CQ 社区版 2.2.0 发布 | 配置要求降为 4 核 16G!!!

BinTools图尔兹

数据库 数据安全 数据库管控工具 数据库管控

可观测性 Trace 全量存储之性能优化

乘云数字DataBuff

APM 可观测性 k8s监控 全链路追踪 Dynatrace

告别内卷,瓴羊飞渡,中国ToB生态迎来 iPhone 时刻

B Impact

银行机构数据治理案例解读,构建全行数据资产体系

袋鼠云数栈

数字化转型 金融

苹果iOS App Store上架操作流程详解:从开发者账号到应用发布

学科知识图谱学习平台项目 :技术栈Java、Neo4j、MySQL等超详细教学

汀丶人工智能

人工智能 自然语言处理 深度学习 neo4j 知识图谱

蚂蚁集团积极参与《金融业分布式信息系统运维技术研究报告》的编写

TRaaS

火山引擎徐广治:边缘云,下一代云计算

火山引擎边缘云

云计算 边缘云 火山引擎边缘云

牛刀专业低代码开发实战—奖酬金预分配

牛刀专业低代码

低代码 牛刀低代码 低代码paas平台 java低代码 私有化低代码

牛刀低代码开发实战—物联网车载大气监测

牛刀专业低代码

低代码 低代码开发平台 起步牛刀低代码 牛刀低代码 低代码paas平台

“开放合作 共享未来”华秋联手伙伴共创硬件生态,助力物联网硬件加速创新

华秋电子

从十万行代码定位undefined is not an object (evaluating 't.length')

汽车之家客户端前端团队

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