1. 包
1.1 使用第三方包
Go语言标准库提供了很多功能,但也并非包罗万象,一旦标准库无法满足项目的需求,开发人员通常会面临两种选择。
- 自己编写解决问题代码
- 寻找能够解决问题的包
大多数程序员会倾向于选择第二种做法,即使用第三方包。
- 第一方包:程序员自己编写的包
- 第二方包:Go语言自带的包
- 第三方包:其它开发者提供的包
在选择第三方包时,下面这些问题需要先考虑清楚:
- 这些代码是做什么的?
- 优秀的第三方包都有卓越的文档,通过阅读这些文档,可以了解该包是否提供了所需要的功能。
- 这些代码值得信任吗?
- 一旦包被导入程序,它就有能力访问操作系统的底层,因此事先了解包的可信任程度至关重要。
- 有多少人在使用该包,他们的评价如何,是否有可信赖的同行或者同事推荐该包,阅读源代码。
- 这些代码有人维护吗?
- 不要选择几年都没有更新的包,而应选择开发方积极维护的包,随着时间的推移,这样的包会变得越来越稳定。
- 这些代码值得使用吗?
- 导入第三方包势必增加程序的复杂性和风险,只为了很小的功能付出这样的代价也许并不值得。
1.2 安装第三方包
要使用第三方包,必须先通过go get命令安装它,例如:
- go get github.com/golang/example/stringutil
- 安装成功以后,该包的代码将被保存在[GOPATH]/src/github.com/golang/example/stringutil/目录下
- reverse.go
- reverse_test.go
- 使用该包需要通过import语句指明包路径,并在其导出的标识符前面加上包名和"."
- import "github.com/golang/example/stringutil"
- fmt.Println(stringutil.Reverse(s))
第三方包可能还会依赖其它第三方包,go get命令会自动解决这些依赖问题。
// 使用第三方包
// 要使用标准库以外的第三方包,必须先通过go get命令安装它
// go get github.com/golang/example/stringutil
// 第三方包可能还会依赖其它第三方包,go get命令会自动解决这些依赖问题
package main
import (
"fmt"
"github.com/golang/example/stringutil"
)
func main() {
s := "ti esrever dna ti pilf nwod gniht ym tup I"
fmt.Println(stringutil.Reverse(s)) // 逆转字符串
}
// I put my thing down flip it and reverse it
1.3 管理第三方依赖
go get命令还可用于更新已安装的特定包、所有包或项目所依赖的包。
- 更新特定包,执行如下命令:
- go get -u github.com/golang/example/stringutil
- 更新所有包,执行如下命令:
- go get -u all
- 更新项目所依赖的包,在项目文件夹中执行如下命令:
- go get -u
不同的项目可能会依赖同一个第三方包的不同版本,如果都安装在GOPATH目录下,会因路径相同而发生冲突。为此可在项目目录下创建名为"vendor"的子目录,该目录在包路径的搜索过程中比全局的GOPATH目录享有更高优先级,只要将项目所依赖的特定版本的包放到该目录下即可。
使用私有依赖的项目目录结构类型下面这样:
server/
├──vendor/ -- 私有依赖
│ └──github.com/
│ └──golang/
│ └──example/
│ └──stringutil/
│ ├──reverse.go
│ └──reverse_test.go
├──dao/
├──network/
├──main.go
└──user.go
//使用vendor目录存放第三方包
// 在当前项目下创建vendor目录,将第三方包存放到该目录下,这些包将仅为本项目所用
package main
import (
"fmt"
"github.com/golang/example/stringutil"
)
func main() {
s := "ti esrever dna ti pilf nwod gniht ym tup I"
fmt.Println(stringutil.Reverse(s))
// I put my thing down flip it and reverse it
}