go学习记录——第十天
自定义包的目录结构、go install 和 go test
书里为了示范搞了个名为 uc 的简单包,含有一个 UpperCase 函数将字符串的所有字母转换为大写。
自定义包的目录结构
下面给了一个已经弄好的示范( uc 表示通用包名,名字为粗体的代表目录,斜体表示可执行文件。结果上传之后压根没显示,给个链接大家需要的话自己去看uc)
1 | |
将项目放在 goprograms 目录下(可以创建一个环境变量 GOPATH ,在 .profile and .bashrc 文件中添加 export GOPATH=/home.user/goprograms )而项目将作为 src 的子目录。 uc 包中的功能在 uc.go中实现。
示例uc.go
1 | |
包通常附带一个或多个测试文件,这里我们创建一个 us_test.go文件
示例test.go
1 | |
通过指令编译并安装包到本地:go install uc ,这回将 uc.a 复制到 pkg/linux_amd64 下面。
另外,使用 make,通过以下内容创建一个包的 Makefile 在 src/uc 目录下
1 | |
在该目录下的命令行调用:gomake
这将创建一个 _obj 目录并将包编译生成的存档 uc.a 放在该目录下
这个包可以通过 go test 测试
PS:如果当前用户没有足够的权限使用 go install 命令,这种情况下,选择 root 用户 su。确保Go环境变量和Go源码路径也设置给 su,同样也适用于普通用户
接下来创建主程序 ucmain.go :
1 | |
然后在这个目录下输入 go install
另外复制 uc.a 到 /home/user/goprograms 目录并创建一个 Makefile 并写入文本:
1 | |
执行 gomake 编译 ucmain.go 生成可执行文件 ucmain
运行 ./ucmain 显示:USING PACKAGE UCI
本地安装包
本地宝在用户目录下,使用给出的目录结构,以下命令用来从源码安装本地包
1 | |
安装到 $GOPATH 下:
如果箱安装的包在系统上的其他 Go 程序中使用,则一定要安装到 $GOPATH 下。这样做,在 .profile 和 .bashrc 中设置 export GOPATH=/home/user/goprograms
然后执行 go install uc 将会复制包存档到 $GOPATH/pkg/LINUX_AMD64/uc
现在,uc包可以通过 import "uc"在任何程序中被引用了
依赖系统的代码
在不同的操作系统上运行的程序以不同的代码实现是非常少见的,通常情况下语言和标准库解决了大部分可移植性问题(要是每个程序都得重新写一遍,开发怕是得疯掉)
1 | |
上面的 prog1.go 定义了不同操作系统通用的接口,并将系统特定的代码写到 prog1_os.go中,对于 Go 工具可以指定 prog1_$GOOS.go 或 prog1_$GOARCH.go 或在平台 Makefile 中:prog1_$(GOOS).go\ or prog1_$(FOARCH).go\
通过Git打包和安装
安装到GitHub
这个不必多说,谁要是说自己不会Git的,直接叉出去乱棍打死。
概括一下就是git init -> git add -> git commit -> git push
从GitHub安装
简单来说就是先go get github.com/***/**
然后机器上就可以使用导入路径import ** URL
抄一下书上写的网站和版本控制系统
- BitBucket(hg/Git)
- GitHub(Git)
- Google Code(hg/Git/svn)
- Launchpad(bzr)
Go的外部包和项目
现在已经把Go和标准库怎么用了解了个七七八八,但是Go的生态没那么简单,所以在使用前最好查一下第三方包或项目能不能使用(还是版本支不支持,记一下记一下)
Go Walker 支持根据包名在海量数据中查询
目前已经有很多非常好的外部库(好多熟悉的身影啊)
- MySQL(GoMySQL), PostgreSQL(go-pgsql), MongoDB (mgo, gomongo), CouchDB (couch-go), ODBC (godbcl), Redis (redis.go) and SQLite3 (gosqlite) database drivers
- SDL bindings
- Google’s Protocal Buffers(goprotobuf)
- XML-RPC(go-xmlrpc)
- Twitter(twitterstream)
- OAuth libraries(GoAuth)
在 Go 程序中使用外部库
这部分相当于一个比较完整的流程,有点啰嗦我感觉(可能加上我自己的吐槽会更啰嗦,小声哔哔ing)
具体的话就是建立一个 Web 应用和其 Google App Engine 版本,会在第19和21章分别进行具体说明,后续可以回来看(估计书里后续还有URL可以跳转,到时候再看,先打个tag)
当开始一个新项目或增加新功能到现有项目时,可以通过在应用程序中使用已有库来节省开发时间。为了做到这一点,我们就需要理解库的 API,也就是库中的那些方法可以调用,如何调用。可能没有源码,但是作者写的文档一定有记载怎么去使用(文档大法好)
举个例子,我们将Google的 API 的 urlshortener 编写成一个小程序:可以尝试在http://goo.gl输入一个像"http://www.destandaard.be"这样的URL,就会看到一个像"http://goo.gl/O9SUO"这样更短的URL返回,也就是说,在Twitter之类的服务中,这是非常容易嵌入的(虽然但是我还是没明白这玩意是啥意思,难不成就是借助`goo.gl`去对某个URL进行指引,方便嵌入然后能够在平台查看点击统计和分析相关功能吗?不过我这边看到`goo.gl`现在已经在筹备关闭了,得找其他的短链接服务了,不过逻辑上应该差不多)
Google 让通过使用 Google API Go 客户端服务的开发者开发变得更加简单,Go客户端程序自动生成 Google 库的 JSON 描述,详情在项目页面查看(还没看,先贴上去吧)
下载并安装Go客户端:通过 go install 实现。但是首先要验证环境变量中是否含有 GOPATH 变量,因为外部源码被下载到 $GOPATH/src 目录下并被安装到 $GOPATH/PKG/"machine_arch"/ 目录下。
我们将通过在终端调用以下命令来安装 API
1 | |
go install 将下载源码,编译并安装包
使用 urlshortener 服务的 Web 程序:现在我们可以通过导入并赋予别名来使用已安装的包
1 | |
现在我们来写一个 Web 应用(参考第15章 4-8 节 通过表单实现短地址和长地址的相互转换。我们将使用 template 包并写三个处理函数:root() 函数通过执行表单模板来展示表单,short() 函数将长地址转换为短地址,long() 函数逆向转换。
要调用 urlshortener 接口必须先通过 http 包中的默认客户端创建一个服务实例 urlshortenerSvc:
1 | |
通过调用服务中的 Url.Insert 中的 Do 方法传入包含长地址的 Url 数据结构从而获取短地址:
1 | |
返回 url 的 Id 便是我们需要的短地址。
通过调用服务中的 Url.Get 中的 Do 方法传入包含短地址的 Url 数据结构从而获取长地址:
1 | |
返回的长地址便是转换前的原始地址。
1 | |
执行这段代码
1 | |
通过浏览 http://localhost:8080 的页面来测试
这里书里说并没有进行检测返回的错误状态,但真实的生产环境一定要进行检测(我也觉得,不怕一万就怕万一)
将应用放在 Google App Engine ,我们只需要在之前的代码中做出如下改变
1 | |
创建一个和包同名的目录 urlshort ,并将一下两个安装目录复制到这个目录:
1 | |
此外还要配置下配置文件 app.yaml,内容如下:
1 | |
现在可以到项目目录并在终端运行: dev_appserver.py urlshort
然后在浏览器打开 http://localhost:8080