文章: Go语言开发工具LiteIDE

标签: 文章 go 语言 | 发表时间:2013-02-18 15:35 | 作者:
出处:http://pipes.yahoo.com/pipes/pipe.info?_id=10560380f804c7341f042a2b8a03e117

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 5 -3 2 -1 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),他的邮件是[email protected]

您可能也会喜欢

相关 [文章 go 语言] 推荐:

文章: Go语言开发工具LiteIDE

- - InfoQ cn
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语言插件.

Go 语言初步

- wei - 云风的 BLOG
所谓认真玩,就是拿 Go 写点程序,前后大约两千行吧. 据说 Go 的最佳开发平台是 Mac OS ,我没有. Windows 版还没全部搞定,但是也可以用了. 如果你用 google 搜索,很容易去到一个叫 go-windows 的开源项目上. 如果你用这个,很多库都没有,而且语法也是老的. 我在 Windows 下甚至不能正确链接自己写的多个 package.

采访:关于 Go 语言和《Go Web编程》

- - 开源中国社区最新新闻
最近,在网上出现了一本名为《Go Web编程》的书籍,里面详细地讲述了使用Go语言进行Web编程的各个方面. 很特别的是,这本书是在GitHub上以开源的方式撰写的. 日前,InfoQ采访了这本书的作者谢孟军先生,请他来和大家谈谈Go语言以及他撰写的开源书籍. InfoQ:请您先简单和大家介绍一下自己.

《学习Go语言》0.4 中文版

- way - python.cn(jobs, news)
鱼哥(https://twitter.com/#!/smallfishxy)上个月勒令我要完成 0.4 版的翻译. 之前公司重组的时候,没顾上看英文版本的更新,结果这老外不声不响的做了如此之多的改动……. 于是只好人工 diff,一条一条的对比 commit 内容. 总算是跟进到了 0.4 这个 tag.

go语言编写Web程序

- - 博客园_首页
创建一个数据类型,含有load和save函数. 基于http包创建web程序. 基于template包的html模板技术. 使用regexp包验证用户输入. web程序的基础技术(HTTP, HTML). 首先,要有一个Linux, OS X, or FreeBSD系统,可以运行go程序. 如果没有的话,可以安装一个虚拟机(如VirtualBox)或者 Virtual Private Server.

为什么放弃Go语言【转载】

- - 编程语言 - ITeye博客
转载地址: http://blog.csdn.net/liigo/article/details/23699459. 有好几次,当我想起来的时候,总是会问自己:我为什么要放弃Go语言. 开门见山地说,我当初放弃Go语言(golang),就是因为两个“不爽”:第一,对Go语言本身不爽;第二,对Go语言社区里的某些人不爽.

Dropbox 开源其 Go 语言库 —— godropbox

- - 开源中国社区最新新闻
Dropbox的成功大部分归功于Python,这个语言可以使我们快速迭代开发. 然而,为了支持日益增长的用户量,我们的基础设施日渐成熟,这时 我们开始寻找一种更为高效的方式来改变系统规模. 大约在一年前,我们作出决定,把对于性能要求很苛刻的后台部分从Python迁移到了Go语言,以提供更 好的并发支持和更快的运行速度.

为什么要使用 Go 语言,Go 语言的优势在哪里?

- - 知乎每日精选
可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,部署就是扔一个文件上去就完成了. 静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出来隐藏的大多数问题,动态语言的感觉就是有很多的包可以使用,写起来的效率很高. 语言层面支持并发,这个就是Go最大的特色,天生的支持并发,我曾经说过一句话,天生的基因和整容是有区别的,大家一样美丽,但是你喜欢整容的还是天生基因的美丽呢.

GO 工具包安装方法 - Go语言中文网 - Golang中文社区

- -
go 安装依赖包一般会通过四种路径. 比如我们可以通过go get github.com/xxx来下载安装包. 下载好之后, 通过go install github.com/xxx来安装包. 安装包会下载到$GOPATH/src文件中. 安装后的执行文件在$GOPATH/bin文件. 当我们执行go get golang.org/x/tools/cmd/goimports会报错.