一、使用包实现代码重用
在Go语言中,包用于代码编组,以便在Go程序中导入并使用他们。
1 导入包
package main
import (
"fmt"
)
func main(){
fmt.Println("Hello World!")
}
- Go程序以package语句开头。
- main包是一种特殊的包,其特殊之处在于不能导入。
- 对main包的唯一要求是,必须声明一个main函数,这个函数不接受任何参数且不返回任何值,这一点和C是有区别的
- main包是程序的入口
- 在main包中,可使用import声明来到如其他包。导入包后,就可以使用其中被导出的(即公有的)标识符。在Go语言中,标识符可以是变量、常量、类型、函数或方法、这让包能够通过接口提供各种功能。例如:math中的Pi
- 导入包并使用其中导出的标识符,是重用标准库和其他第三方代码的基本方式
2 理解包的用途
无他,唯手熟尔。其实世界上本没有包,用的人多了,也便成了包
关于几个包的用途:
包名 | 用途 |
---|---|
strings | 用于处理字符串的函数 |
bytes | 用于处理字节的函数 |
fmt | 实现Go中的输入和输出 |
strconv | 实现对字符串和基本数据类型之间的转换 |
time | 关于时间的一些操作 |
3 使用第三方包
标准库提供了很多功能,但Go语言的设计理念是确保核心标准库小巧而稳定,因此标准库没有提供连接到数据库、分析文件格式以及实现身份验证协议的功能。如果我们需要更多的功能可以考虑使用第三方包。
使用第三方包时要考虑如下问题:
4 安装第三方包
使用第三方包,必须首先使用命令go get安装它。这个命令默认随Go一起安装了,它将指向远程服务器中包的罗京作为参数,并在本地安装指定的包。
go get github.com/golang/example/stringutil
执行这个命令的时候可能会报错,我遇到的问题如下:
我的解决方法在这里,如果有道友能够详细解释一下为什么这样做就更好了
这个包被安装到环境变量GOPATH指定的路径中,因此可在程序中使用它。
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
}
5 管理第三方依赖
这部分在书中没有过多阐述(PS:dep在本书编写的时候正在开发),在网上百度了一下官方的包管理器,众说纷纭。emm,以下是一些管理器的链接
刚刚找到一大佬的文章
本文前面介绍了如何安装远程包,但在使用第三方包时,还需要考虑众多不同的因素
- 如何更新包以修复缺陷?
- 如何指定版本?
- 如何与其他开发人员分享依赖清单?
- 如何在构建服务器中安装依赖?
以下是一些解决问题的办法:
-
使用命令
go get
可更新文件系统中特定的包或所有的包。
a.要更新项目的依赖,可在项目文件夹中执行如下命令:
go get -u
b.也可只更新特定的包。
go get -u github.com/spf13/hugp
c.还可更新文件系统中所有的包。
go get -u all
命令
go get
从本地分支匹配的远程分支中获取源代码,例如,如果本地分支为master
,则这个命令将从远程分支master获取最新的源代码。 -
在大多数情况下,更新包很简单,但有时可能很复杂,例如,在多个项目中使用了同一个第三方库时:项目A依赖于某个第三方库的1.2版,而项目B依赖于1.3版。
为应对这种情况,Go 1.5版引入了文件夹vendor,这能我们将第三方模块添加到项目目录下的文件夹
vender
中,并将所有包文件都转移到这个文件夹中。这样可以不全局的安装包,而仅在项目中安装它。对于前面安装的stringutil包,可将其移到文件夹vendor中,这样项目结构如下:
>此时,我们只能在这个项目中使用stringutil
包,因为他不是全局的。这种做法的优点如下:
a). 可锁定包的版本,为此只需要将特定版本复制到项目目录中。
b). 构建服务器无需下载依赖,因为它们包含在项目中。同样,缺点也很明显:
a). 依赖必须包含在仓库中
b). 使用的是包的哪个版本不明显
c). 没有处理包的依赖
d). 无法在清单文件中准确地指定提交或分支
6 创建包
创建包然后发布到github以便与人分享
话不多数直接看例子
package temperature
func CtoF(c float64) float64{
return (c*(9/5))+32
}
func FtoF(c float64) float64{
return (c-32)/(9/5)
}
在这里要注意的是,开头大写的标识符是可以在包外使用的(引入包后可以在main函数中使用),开头小写的标识符是私有成员变量。
对于要发布到网上的包,我们需要更多地从用户的角度考虑。推荐在包中包含以下三个文件:
- 指出用户如何使用代码的
LICENSE
文件。 - 包含有关包的说明信息的
README
文件 - 详细说明包经过了哪些修改的
Changlog
文件
参考书籍
[1]: 【Go语言入门经典】[英] 乔治·奥尔波 著 张海燕 译