Go语言学习笔记(十三)

  • 一、使用包实现代码重用
  • 1 导入包
  • 2 理解包的用途
  • 3 使用第三方包
  • 4 安装第三方包
  • 5 管理第三方依赖
  • 6 创建包

一、使用包实现代码重用

在Go语言中,包用于代码编组,以便在Go程序中导入并使用他们。

1 导入包

package main
import (
	"fmt"
)

func main(){
	fmt.Println("Hello World!")
}
  1. Go程序以package语句开头。
  2. main包是一种特殊的包,其特殊之处在于不能导入。
  3. 对main包的唯一要求是,必须声明一个main函数,这个函数不接受任何参数且不返回任何值,这一点和C是有区别的
  4. main包是程序的入口
  5. 在main包中,可使用import声明来到如其他包。导入包后,就可以使用其中被导出的(即公有的)标识符。在Go语言中,标识符可以是变量、常量、类型、函数或方法、这让包能够通过接口提供各种功能。例如:math中的Pi
  6. 导入包并使用其中导出的标识符,是重用标准库和其他第三方代码的基本方式

2 理解包的用途

无他,唯手熟尔。其实世界上本没有包,用的人多了,也便成了包
关于几个包的用途:

包名

用途

strings

用于处理字符串的函数

bytes

用于处理字节的函数

fmt

实现Go中的输入和输出

strconv

实现对字符串和基本数据类型之间的转换

time

关于时间的一些操作

3 使用第三方包

标准库提供了很多功能,但Go语言的设计理念是确保核心标准库小巧而稳定,因此标准库没有提供连接到数据库、分析文件格式以及实现身份验证协议的功能。如果我们需要更多的功能可以考虑使用第三方包。

使用第三方包时要考虑如下问题:

GO语言 汉子MD5加密 go语言main包_Go

4 安装第三方包

使用第三方包,必须首先使用命令go get安装它。这个命令默认随Go一起安装了,它将指向远程服务器中包的罗京作为参数,并在本地安装指定的包。

go get github.com/golang/example/stringutil

执行这个命令的时候可能会报错,我遇到的问题如下:

GO语言 汉子MD5加密 go语言main包_标识符_02


这个包被安装到环境变量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,以下是一些管理器的链接

  1. dep是一个golang依赖管理工具,需要在Go 1.7及更高的版本中使用。
  2. govendor 是go1.5 官方引入管理包依赖的方式,1.6正式引入

本文前面介绍了如何安装远程包,但在使用第三方包时,还需要考虑众多不同的因素

  • 如何更新包以修复缺陷?
  • 如何指定版本?
  • 如何与其他开发人员分享依赖清单?
  • 如何在构建服务器中安装依赖?
    以下是一些解决问题的办法:
  1. 使用命令go get可更新文件系统中特定的包或所有的包。
    a.要更新项目的依赖,可在项目文件夹中执行如下命令:
    go get -ub.也可只更新特定的包。
    go get -u github.com/spf13/hugpc.还可更新文件系统中所有的包。
    go get -u all命令go get从本地分支匹配的远程分支中获取源代码,例如,如果本地分支为master,则这个命令将从远程分支master获取最新的源代码。
  2. 在大多数情况下,更新包很简单,但有时可能很复杂,例如,在多个项目中使用了同一个第三方库时:项目A依赖于某个第三方库的1.2版,而项目B依赖于1.3版。

为应对这种情况,Go 1.5版引入了文件夹vendor,这能我们将第三方模块添加到项目目录下的文件夹vender中,并将所有包文件都转移到这个文件夹中。这样可以不全局的安装包,而仅在项目中安装它。对于前面安装的stringutil包,可将其移到文件夹vendor中,这样项目结构如下:

GO语言 汉子MD5加密 go语言main包_第三方包_03

>

此时,我们只能在这个项目中使用

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文件