『GoLang』包

可见性规则

在Go语言中,标识符必须以一个大写字母开头,这样才可以被外部包的代码所使用,这被称为导出。标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的。但是包名不管在什么情况下都必须小写。

在设计Go语言时,设计者们也希望确保它不是过于以ASCII为中心,这意味着需要从7位ASCII的范围来扩展标识符的空间。 所以Go语言标识符规定必须是Unicode定义的字母或数字,标识符是一个或多个Unicode字母和数字的序列, 标识符中的第一个字符必须是Unicode字母。

包的概念

Go语言使用包(package)的概念来组织管理代码,包是结构化代码的一种方式。和其他语言如JAVA类似,Go语言中包的主要作用是把功能相似或相关的代码组织在同一个包中,以方便查找和使用。在Go语言中,每个.go文件都必须归属于某一个包,每个文件都可有init()函数。包名在源文件中第一行通过关键字package指定,包名要小写。如下所示:

package fmt

每个目录下面可以有多个.go文件,这些文件只能属于同一个包,否则编译时会报错。同一个包下的不同.go文件相互之间可以直接引用变量和函数,所以这些文件中定义的全局变量和函数不能重名。

Go语言的可执行应用程序必须有package main,而且在main包中必须且只能有一个main()函数main()函数是应用程序运行开始入口。在main包中也可以使用init()函数。

Go语言不强制要求包的名称和文件所在目录名称相同,但是这两者最好保持相同,否则很容易引起歧义。因为导入包的时候,会使用目录名作为包的路径,而在代码中使用时,却要使用包的名称。

package的导入

一个Go程序通过import关键字将一组包链接在一起。import其实是导入目录,而不是定义的包名称,实际应用中我们一般都会保持一致。

例如标准包中定义的big包:package big,import "math/big" ,源代码其实是在GOROOTsrc中的src/math/big目录。在代码中使用big.Int时,big指的才是.go文件中定义的包名称。

导入多个包时,一般按照字母顺序排列包名称,像GoLand会在保存文件时自动完成这个动作。所谓导入包即等同于包含了这个包的所有的代码对象

为避免名称冲突,同一包中所有对象的标识符必须要求唯一。但是相同的标识符可以在不同的包中使用,因为可以使用包名来区分它们

import语句一般放在包名定义的下一行,导入包示例如下:

package main

import  "context"  //加载context包

导入多个包的常见的方式是:

import  (
    "fmt"
    "net/http"
 )

调用导入的包函数的一般方式:

fmt.Println("Hello World!")

下面介绍三种特殊的import方式:

  • import . "fmt" 点操作的含义是某个包导入之后,在调用这个包的函数时,可以省略前缀的包名,如这里可以写成Println("Hello World!"),而不是fmt.Println("Hello World!")
  • import f "fmt" 别名操作调用包函数时,前缀变成了别名,即f.Println("Hello World!")。在实际项目中有时这样使用,但请谨慎使用,不要不加节制地采用这种形式。
  • import _ "github.com/go-sql-driver/mysql"_ 操作是引入某个包,但不直接使用包里的函数,而是调用该包里面的init函数,比如这个mysql包的导入。此外在开发中,由于某种原因某个原来导入的包现在不再使用,也可以采用这种方式处理。

包的初始化

Go语言中init()函数常用于包的初始化,该函数是Go语言的一个重要特性,有下面的特征:

  • init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
  • 每个包可以拥有多个init函数
  • 包的每个源文件也可以拥有多个init函数
  • 同一个包中多个init()函数的执行顺序不定
  • 不同包的init()函数按照包导入的依赖关系决定该函数的执行顺序
  • init()函数不能被其他函数调用,其在main函数执行之前,自动被调用

导入外部包

如果你要在你的应用中使用一个或多个外部包,你可以使用go install在你的本地机器上安装它们。go install 是Go语言中自动包安装工具:如需要将包安装到本地它会从远端仓库下载包:检出、编译和安装一气呵成。

假设你想使用https://github.com/gocolly/colly 这种托管在 Google Code、GitHub 和 Launchpad 等代码网站上的包。

你可以通过如下命令安装: go install github.com/gocolly/colly 将一个名为 github.com/gocolly/colly 安装在GOPATH/pkg/ 目录下。

go install/build都是用来编译包和其依赖的包。

区别: go build只对main包有效,在当前目录编译生成一个可执行的二进制文件(依赖包生成的静态库文件放在GOPATH/pkg)。

go install一般生成静态库文件放在GOPATH/pkg目录下,文件扩展名a

相关推荐