Go语言学习笔记(十三)

一、使用包实现代码重用

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

使用第三方包时要考虑如下问题:
在这里插入图片描述

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,以下是一些管理器的链接

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

刚刚找到一大佬的文章

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

  • 如何更新包以修复缺陷?
  • 如何指定版本?
  • 如何与其他开发人员分享依赖清单?
  • 如何在构建服务器中安装依赖?
    以下是一些解决问题的办法:
  1. 使用命令go get可更新文件系统中特定的包或所有的包。
    a.要更新项目的依赖,可在项目文件夹中执行如下命令:
    go get -u
    b.也可只更新特定的包。
    go get -u github.com/spf13/hugp
    c.还可更新文件系统中所有的包。
    go get -u all

    命令go get从本地分支匹配的远程分支中获取源代码,例如,如果本地分支为master,则这个命令将从远程分支master获取最新的源代码。

  2. 在大多数情况下,更新包很简单,但有时可能很复杂,例如,在多个项目中使用了同一个第三方库时:项目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语言入门经典】[英] 乔治·奥尔波 著 张海燕 译
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是兔不是秃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值