阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

评论

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

BEANZ NFT 概览与数据分析

Footprint Analytics

blockchain NFT

用户使用433MHz无线模块时,出现偶尔无法收发数据的原因?

Geek_ab1536

文生视频Sora模型发布,是否引爆AI芯片热潮

申公豹

人工智能

比特币价格突破62000美元,近一个月涨幅超过40%

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

iPaaS如何实现安全通信保障

RestCloud

信息安全 ipaas

多种方式获取淘宝商品详情数据,关键词搜索商品列表,店铺ID获取店铺所有商品,按图搜索获取商品详情数据

Anzexi58

API 文档

7万张H100打造的Open AI文生视频Sora功能原理详解|Sora注册全攻略

蓝海大脑GPU

立即报名|3 月 8 日北京,稳定性 & 可观测沙龙来了!

阿里巴巴云原生

阿里云 容器 微服务 云原生

可用于智能客服的完全开源免费商用的知识库项目

不在线第一只蜗牛

架构 开源项目 技术栈 智能客服

AI PC的风刮到企业里,看英特尔vPro怎么做到的

E科讯

【数字永生】SaaS系统源码独立部署,行业独家!

青否数字人

数字人

JAVA请求示例获取1688商品详情数据API接口item_get-获得阿里巴巴商品详情(按关键词搜索商品列表)

Anzexi58

API 文档

商用AI PC,能帮企业带来什么?

E科讯

L2 网络 Mint Blockchain 正式对外发布测试网

NFT Research

blockchain NFT 测试网络

探索基于Stable Diffusion的智能绘画大模型

百度开发者中心

人工智能 深度学习 图像 大模型

J17资本合伙人SKY LAI确认出席Hack .Summit() 2024区块链开发者盛会

TechubNews

WPF性能优化:性能分析工具

EquatorCoco

性能优化 服务器 WPF

深度解析:Allure报告如何提升你的测试效率?

测试人

软件测试 自动化测试 测试开发

请求示例JAVA获取淘宝商品详情数据API接口item_get-获得淘宝商品详情(按关键词搜索商品列表)

Anzexi58

API 文档

互联网大厂面试题解析之大疆一面

派大星

Java 面试题 互联网大厂面试

什么是渗透测试?有哪些类型?

小齐写代码

对比传统主机,云主机贵吗?是否值得购买?

一只扑棱蛾子

云主机

大模型+搜索:构建完整技术栈,为企业定制化注入新活力

百度开发者中心

数字 大模型 人工智能、

盘点6个最受欢迎的 Vue.js UI 库

秃头小帅oi

IDC 中搭建 Serverless 应用平台:通过 ACK One 和 Knative 玩转云资源

阿里巴巴云原生

阿里云 云原生 容器服务

『双向奔赴,绿动未来』 ——能效电气2024新品发布会

Geek_2d6073

奇点云:SAFe框架下,我们对平台软件工程生产线做了4项改造

奇点云

大数据平台 制造业 奇点云

抢占市场先机:利用API商品数据接口激活您的数据资产

Noah

干货!Windbg 在 TDengine 内存泄漏调试中的应用与实践分享

TDengine

tdengine 时序数据库 内存泄漏 windbg

骚操作之 持有 ReadOnlySpan 数据

八苦-瞿昙

C#

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