Golang之旅2:工程结构
来源:互联网 发布:国家顶级域名 中文域名 编辑:程序博客网 时间:2024/06/16 15:08
0x00 前言
我一直对go中的一些概念比较模糊,比如它的GOPATH到底是个什么意思、项目目录是怎么布局的、怎样做的测试。因此这次就先上一个小工程,试试水。
0x01 工程概要
功能
实现一个小的计算器功能(代码是借鉴来的^_^)。
目前有的功能是add和sqrt。
dante@dante-pc:~/workspace/go/calcproj/bin$ ./calcUSAGE: calc command [arguments] ...The commands are: add Addition of two values. sqrt Square root of a non-negative value.
工程目录结构
我一直感觉这种目录结构能很直观地帮助理解。
我把这个calcproj添加到了GOPATH中。
export GOROOT=/opt/go export GOPATH=/home/dante/workspace/go/calcprojexport PATH=$PATH:$GOROOT/bin:$GOPATH/bin
假设这个工程被分割为两个部分:
- 可执行程序,名为 calc ,内部只包含一个calc.go文件;
- 算法库,名为 simplemath ,每个 command对应于一个同名的go文件,比如add.go。
下面是项目目录结构(这些目录是自己创建的)。
dante@dante-pc:~/workspace/go$ tree calcproj/calcproj/├── bin│ └── calc└── src ├── calc │ └── calc.go └── simplemath ├── add.go ├── add_test.go ├── sqrt.go └── sqrt_test.go
0x02 代码
主程序calc.go
package mainimport "os"// 用于获得命令行参数os.Argsimport "fmt"import "simplemath"import "strconv"var Usage = func() { fmt.Println("USAGE: calc command [arguments] ...") fmt.Println("\nThe commands are:\n\tadd\tAddition of two values.\n\tsqrt\tSquare root of a non-negative value.")}func main() { args := os.Args if args == nil || len(args) < 2 { Usage() return } fmt.Println(args[1]) switch args[1] { case "add": if len(args) != 4 { fmt.Println("USAGE: calc add <integer1><integer2>") return } v1, err1 := strconv.Atoi(args[2]) v2, err2 := strconv.Atoi(args[3]) if err1 != nil || err2 != nil { fmt.Println("USAGE: calc add <integer1><integer2>") return } ret := simplemath.Add(v1, v2) fmt.Println("Result: ", ret) case "sqrt": if len(args) != 3 { fmt.Println("USAGE: calc sqrt <integer>") return } v, err := strconv.Atoi(args[2]) if err != nil { fmt.Println("USAGE: calc sqrt <integer>") return } ret := simplemath.Sqrt(v) fmt.Println("Result: ", ret) default: Usage() }}
算法库程序
add.go
//add.gopackage simplemathimport "testing"func TestAdd1(t *testing.T) { r := Add(1, 2) if r != 3 { t.Errorf("Add(1, 2) failed. Got %d, expected 3.", r) }}
sqrt.go
//sqrt.gopackage simplemathimport "testing"func TestSqrt1(t *testing.T) { v := Sqrt(16) if v != 4 { t.Errorf("Sqrt(16) failed. Got %v, expected 4.", v) }}
测试
add_test.go
package simplemathimport "testing"func TestAdd1(t *testing.T) { r := Add(1, 2) if r != 3 { t.Errorf("Add(1, 2) failed. Got %d, expected 3.", r) }}
sqrt_test.go
package simplemathimport "testing"func TestSqrt1(t *testing.T) { v := Sqrt(16) if v != 4 { t.Errorf("Sqrt(16) failed. Got %v, expected 4.", v) }}
0x03 运行和测试
运行
进入bin目录,执行下面命令,就可以看到目录中多了一个calc文件。。
go build calc
然后执行这个程序。
dante@dante-pc:~/workspace/go/calcproj/bin$ ./calc add 100 10addResult: 110dante@dante-pc:~/workspace/go/calcproj/bin$ ./calc sqrt 10sqrtResult: 3
测试
测试比较简单,在任意目录执行下面命令(我在测试程序中,专门改了一个错的结果,因此会报错)。
dante@dante-pc:~/workspace/go/calcproj/bin$ go test simplemath--- FAIL: TestSqrt1 (0.00s) sqrt_test.go:6: Sqrt(16) failed. Got 4, expected 4.FAILFAIL simplemath 0.001s
0x04 注意
注意1
记得添加GOPATH,不然执行上面的build命令时会提示错误。如下:
dante@dante-pc:~/workspace/go$ go build calccan't load package: package calc: cannot find package "calc" in any of: /opt/go/src/calc (from $GOROOT) /home/dante/workspace/go/src/calc (from $GOPATH)
不同版本间的差异
我用的是go1.6.2,参考书的可能比较老,因此代码不能用,问题就出在获取输入参数上。
举个简单例子:
/calc add 100 10
按照参考书上的程序,在判断此处的参数长度是,它用的是if len(args) != 3
,我就必须改成if len(args) != 4
.
这属于语言细节,慢慢体会即可。
0xFF 总结
目前用的还很少,工程也很小,以后慢慢提升把。
2016-4-24 12:38:00 hnds
转载请注明: 转载自赵德栋的 个人主页 CSDN博客
作者:赵德栋,作者介绍
本博客的文章集合:http://zhaodedong.com/category/
0 0
- Golang之旅2:工程结构
- golang 工程目录结构
- golang 工程结构与编译
- Rust golang之结构体
- Golang学习笔记//建议的工程组织结构
- 开启golang之旅
- Golang 工程自管理
- Golang 工程组织
- golang 工程引入包。
- Golang 工程组织
- Golang 优化之路——空结构
- golang之cgo---类型转换小试牛刀之C结构体和go结构体转换
- golang项目结构日记
- golang初始化结构体
- Golang结构体分析
- 自学cocos2d-x之tests工程结构
- ios开发之认知ios工程结构
- 代码工程目录组织结构之我见
- android ContentProvider读取其他应用数据库
- 线性筛法 约数个数
- JMeter开发插件之一(JMeter开发Java Request Sampler测试mongodb)
- 结构较复杂的xml和json互转
- iOS访问通讯录
- Golang之旅2:工程结构
- 毕设的开始——我的爆炸之旅
- Ubuntu16.04 安装flash
- 利用ajax导出Excel文件
- Golang之旅3:三种读文件方式
- android 源码编译&烧制
- JavaScript原生方法写瀑布流
- 第八周 OJ总结<3>-求值
- cocoa Unknown type name 'class'; did you mean 'Class'? 问题解决