写点什么

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

评论

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

24H营业的无人售药机上线 EasyDL帮你实现“排队自由”

百度大脑

人工智能 百度

内测邀请|宜搭应用搭建体验全新升级,邀您抢先体验!

一只大光圈

钉钉 低代码 数字化转型 低代码平台 钉钉宜搭

技术分享 | 让实时协同的框架绘图变得丝滑起来

ShowMeBug

架构 绘图 实时消息

统一门户系统解决方案,协同办公更敏捷!

BeeWorks

36道Java经典基础与高级面试题,面完(18K)你同意吗?

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

AfterShip 亿级流量 API 网关的演进

AfterShip

架构演进 kong API Gateway

Gartner预测到2025年,将有一半的云数据中心部署具有人工智能功能的机器人

BeeWorks

恒源云(GPUSHARE)_云GPU服务器如何使用Visdom?

恒源云

人工智能 深度学习

架构实战营 - 模块4作业

无名

「架构实战营」

百分点大数据技术团队:基于HugeGraph的知识图谱技术在白酒行业的落地实践

百分点科技技术团队

Gartner杰出研究副总裁Mark Raskino:为什么元宇宙商业离我们还很遥远?

BeeWorks

大规模任务调度在 AfterShip 的高可用实践

AfterShip

高可用 任务调度 基础架构

2021网易创新企业大会来了!

网易云信

科技 元宇宙

实施进度难同步,项目管理搞定它!

明道云

详解TCP常见的五个异常处理场景,其实TCP聪明得很

热爱java的分享家

Java 架构 程序人生 编程语言 架构师

你真的懂Redis的5种基本数据结构吗?

华为云开发者联盟

redis 容器 数据结构 数据 字符串

So eazy!SpringBoot一键去除参数前后空格和XSS过滤实战解析

热爱java的分享家

Java 架构 程序人生 编程语言 架构师

Nebula Graph 源码解读系列 | Vol.05 Scheduler 和 Executor 两兄弟

NebulaGraph

数据库 图数据库

用Python保住“设计大哥“的头发,直接甩给他10000张参考图,爬虫采集【稿定设计】平面模板素材

梦想橡皮擦

11月日更

传统IT开发与低代码开发争议白热化,技术开发规则或将重构?

优秀

低代码 低代码开发 低代码平台

又快又稳!Alibaba出品Java性能优化高级笔记(全彩版)震撼来袭

热爱java的分享家

Java 架构 面试 程序人生

面试只要问到分布式,必问分布式锁

华为云开发者联盟

程序员 分布式 分布式锁 内存 应用

传说中的“大数据杀熟”是怎么做到的?—— RFM 模型了解一下

AfterShip

RFM模型 用户标签 用户画像

19 K8S之临时/hostPath/网络存储卷

穿过生命散发芬芳

k8s 11月日更

惊为天人!Alibaba新产SpringBoot深度历险(嵩山版)开源

热爱java的分享家

Java 架构 面试 程序人生 编程语言

Kafka常用监控框架

大数据技术指南

11月日更

Vanguard CIO:如何在大企业中培养创业心态

BeeWorks

录制快、回放稳,爱奇艺iOS云录制回放平台技术实践

爱奇艺技术产品团队

ios 自动化 测试

CSS奇技淫巧之滤镜(三)

Augus

CSS 11月日更

Elasticsearch写入数据的过程是什么?以及是如何更新索引数据的

热爱java的分享家

Java 架构 程序人生 编程语言 架构师

“阿里爸爸”又爆新作!Github新开源303页Spring全家桶高级笔记

热爱java的分享家

Java 架构 面试 程序人生 编程语言

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