章节索引 :

Go 语言中的包

在 Go 语言的错误处理中我们提到了 errors 包,当时没有详细的介绍。本文就来详细的介绍一下 Go 语言中包相关的概念

和大部分语言一致,Go 语言也是支持调用其它文件中的 Go 代码的。Go 语言是现这一功能则是通过包来实现的。而实现包的功能则是通过关键字 package 来实现的,使用 package 来声明代码所在的包。

1. 基本概念

Go 语言中一般使用文件所在的文件名来命名自己的包名,这样层次清晰便于管理。其中包名定义的注意事项如下:

  • 包名一般都是全小写
  • 包名不可以是路径;
  • 一个文件夹下只能有一个包名;
  • 每个程序的入口包名均为 main,只有有 main 包,程序才可以执行。

2. 包的导入

现在的编译器一般都会帮开发者做掉导包这个功能,但是我们还是要了解一下如何导入一个包,使之可以在程序中使用。我们导入包需要用到一个叫 import 的关键字。

2.1 单行导入

可以使用形如import 包所在路径的方式导入我们想要导入的包,其中包的路径可以使用两种方式来表示:

  • 相对路径:即你的目标包和你当前代码的相对路径。
  • 绝对路径:即 $GOPATH/src$GOROOT/src之后的路径。

代码示例

import firstgo/packagetest1
import ../packagetest2
  • 第 1 行:使用绝对路径导入 packagetest1 这个包;
  • 第 2 行:使用相对路径导入 packagetest2 这个包。

2.2多行导入

多行导入的方式有点类似于多个常量同时定义。

代码示例:

import (
    firstgo/packagetest1
    firstgo/packagetest2
)

3. 使用规则

在 Go 语言中,并不是直接导入了你写的一个包,你就可以直接使用包中的任何代码。这里有一个类似于Java和.NET的私有和公有的概念,你只可以使用导入的包中的公有的函数、变量以及自定义类型。Go 语言中区分公有私有的方法很简单,就是查看函数名、变量名以及自定义类型名的首字母是否为大写,大写的即为公有,小写的为私有

代码示例

package packagetest1

import "fmt"

//定义私有变量name
var name = "Test1"

//PrintName 打印变量name
func PrintName() {
    fmt.Println("packagetest1 Name:", name)
}
package packagetest2

import "fmt"

//定义私有变量name
var name = "Test2"

//PrintName 打印变量name
func PrintName() {
    fmt.Println("packagetest2 Name:", name)
}
package main

import (
    "firstgo/packagetest1"
    "firstgo/packagetest2"
)

func main() {
    packagetest1.PrintName()//调用这个包中的PrintName()函数
    packagetest2.PrintName()//调用这个包中的PrintName()函数
}

执行结果:

图片描述

你在开发 main 包的代码时你会发现,你只能使用导入包中的 PrintName() 函数,而不能使用包中的 name 变量。就是因为函数的首字母是大写,而变量的首字母是小写。

4. 小结

本文主要介绍了 Go 语言中代码复用的方法。其中引入了包的概念,需要注意有以下两个规则:

  • 包名的命名规则:

    • 包名一般都是全小写;
    • 包名不可以是路径;
    • 一个文件夹下只能有一个包名;
    • 每个程序的入口包名均为 main ,只有有 main 包,程序才可以执行。
  • 包中公有和私有的判定规则:公有首字母大写,私有首字母小写。