Loading...
墨滴

Bayanbulake

2021/12/19  阅读:35  主题:自定义主题1

Go语言之包和go工具

引言

Go自带100多个包,可以为大多数应用程序提供基础。Go社区是一个茁壮成长的生态环境,其中鼓励包设计、共享、重用以及改进,已经发布的很多包,可以在https://godoc.org找到。

包管理系统的目的是为了对关联的特性进行分类,组织成便于理解和修改的单元,使其与程序的其它包保持独立,从而有助于设计和维护大型程序。

Go的包管理类似于Java的依赖管理,比如常用的:maven,不同的是,Go的包管理不需要指定GAV坐标,而是需要调用者主动下载包文件。

包通过控制名字是否导出使其对包外可见来提供封装能力,限制包成员的可见性,从而隐藏API后面的辅助函数和类型,允许包的维护者修改包的实现而不影响包外部的代码。限制变量的可见性也可以隐藏变量,这样使用者仅可以通过导出函数来对其访问和更新,它们可以保留自己的不变量以及在并发程序中实现互斥访问。

导入路径

每一个包都通过一个唯一的的字符串进行标识,它称为导入路径。如下:

import "fmt"

包的声明

在每一个Go源文件的开头都需要进行包生明,它的主要目的是当该包被其他包引入的时候作为其默认的标识符。

例如,math/rand包中每一个文件的开头都是package rand,这样当你导入这个包时,可以访问它的成员,比如:rand.Int、rand.Float64等。

package main

import(
 "fmt"
    "math/rand"
)

func main(){
    fmt.Println(rand.Int())
}

导入声明

import "fmt"
import "os"

等价于

import {
    "fmt"
    "os"
}

空导入

如果导入的包的名字没有在文件中引用,就会引起一个编译错误。但是有时候,我们必须导入一个包,这仅仅是为了利用其副作用:对包级别的变量执行初始化表达式求值,并执行它的init函数。为了防止:“未使用的导入”错误,我们必须使用一个重命名导入,它使用一个替代的名字_,这表示导入的内容为空白标识符。通常情况下,空白标识符不可能被引用。

import _ "image/png" // 注册PNG解码器

这称为空白导入,多数情况下,它用来实现一个编译时的机制,使用空白引用导入额外的包,来开启主程序可选的特性。

包及其命名

包名应该尽可能简短,并且保持可读性和无歧义。例如,不要把一个辅助工具包命名为util,使用imageutil或者ioutil则更为合适。

包名通常使用统一的形式,标准包byteserrorsstrings使用复数来避免覆盖响应的预声明类型,使用go/types这个形式,来避免和关键字的冲突。

Go工具

Go工具将不同种类的的工具合并为一个命名集,它是一个包管理器(类似于apt或者rpm),它可以查询包的作者,计算其依赖关系,从远程版本控制系统下载它们。它是一个构建系统,可计算文件依赖、调用编译器、汇编器、链接器,尽管他没有标准的UNIXmake命令完备。

以下列出了常用的命令:

The commands are:

        bug         start a bug report
        build       compile packages and dependencies
        clean       remove object files and cached files
        doc         show documentation for package or symbol
        env         print Go environment information
        fix         update packages to use new APIs
        fmt         gofmt (reformat) package sources
        generate    generate Go files by processing source
        get         add dependencies to current module and install them
        install     compile and install packages and dependencies
        list        list packages or modules
        mod         module maintenance
        run         compile and run Go program
        test        test packages
        tool        run specified go tool
        version     print Go version
        vet         report likely mistakes in packages

工作空间的组织

大部分用户必须进行的唯一配置是:GOPATH环境变量,它指定工作空间的根目录。

GOPATH下有三个子目录:

  • src子目录包含源文件,每一个包放在一个目录中,该目录相对于$GOPATH/src的名字是包的导入路径。

  • pkg子目录是构建工具存储编译后的包的位置。

  • bin目录是存放可执行程序的目录。

go env命令输出与工具链相关的已经设置有效值的环境变量及其所设置的值,还会输出未设置有效值的环境变量及其默认值。如下所示:

包的下载

如果使用go工具,包的导入路径不仅指示了如何在本地空间中找到他的位置,还指明了通过互联网使用go get来获取和更新它的位置。

go get命令可以下载单一的包,也可以使用...符号来下载子树或仓库。

go get命令已经支持多个流行的代码托管站点,如GitHubBitBucketlaunchpad,并且可以向版本控制系统发出合适的请求。

包的构建

go build命令编译每一个命令行参数中的包。如果包的名字是main,go build调用链接器在当前目录中创建可执行程序,可执行程序的名字取自包的导入路径的最后一段。

包可以通过指定目录来指定,可以使用导入路径或者一个相对目录名,目录必须以...开头。

如下所示:

cd anywhere
go build gopl.io/njn/jbnj

以上就是关于包的相关内容。

希望可以帮助到你~

Bayanbulake

2021/12/19  阅读:35  主题:自定义主题1

作者介绍

Bayanbulake