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