乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

    • Golang基础知识

      • 开发环境搭建
      • 常量与变量
      • 基本数据类型
      • 复合数据类型
      • 流程控制
      • 运算符
      • 位运算符详解
      • 指针
      • map
      • 函数
      • defer
      • 类型别名与自定义类型
      • 结构体
      • 接口
      • 包
        • 包的定义
        • 标识符的可见性
        • 包的导入
          • 单行导入
          • 多行导入
          • 自定义包名
          • 匿名导入包
        • init 函数
          • 介绍
          • 执行顺序
      • 文件操作
      • 反射
      • 并发
      • socket网络编程
      • HTTP网络编程
      • 单元测试
      • 基准测试
      • 并发测试
      • 示例函数
      • 性能优化
      • go module
      • 在Go中使用Makefile
      • 部署Go项目
    • Golang进阶知识

    • Golang常用包

  • AIOps

  • 专栏
  • Golang
  • Golang基础知识
乔克
2025-07-13
目录

包

包是代码的集合,是一种高级代码的复用方案。常用的内置包有fmt、os等。

# 包的定义

我们还可以根据自己的需要创建自己的包。一个包可以简单理解为一个存放.go文件的文件夹。 该文件夹下面的所有 go 文件都要在代码的第一行添加如下代码,声明该文件归属的包。

package 包名
1

注意事项:

  • 一个文件夹下面直接包含的文件只能归属一个package,同样一个package的文件不能在多个文件夹下。
  • 包名可以不和文件夹的名字一样,包名不能包含 - 符号。
  • 包名为main的包为应用程序的入口包,这种包编译后会得到一个可执行文件,而编译不包含main包的源代码则不会得到可执行文件。

# 标识符的可见性

如果想在一个包中引用另外一个包里的标识符(如变量、常量、类型、函数等)时,该标识符必须是对外可见的(public)。在 Go 语言中只需要将标识符的首字母大写就可以让标识符对外可见了。

比如:

package pkg2

import "fmt"

// 包变量可见性

var a = 100 // 首字母小写,外部包不可见,只能在当前包内使用

// 首字母大写外部包可见,可在其他包中使用
const Mode = 1

type person struct { // 首字母小写,外部包不可见,只能在当前包内使用
	name string
}

// 首字母大写,外部包可见,可在其他包中使用
func Add(x, y int) int {
	return x + y
}

func age() { // 首字母小写,外部包不可见,只能在当前包内使用
	var Age = 18 // 函数局部变量,外部包不可见,只能在当前函数内使用
	fmt.Println(Age)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

结构体中的字段名和接口中的方法名如果首字母都是大写,外部包可以访问这些字段和方法。例如:

type Student struct {
	Name  string //可在包外访问的方法
	class string //仅限包内访问的字段
}

type Payer interface {
	init() //仅限包内访问的方法
	Pay()  //可在包外访问的方法
}
1
2
3
4
5
6
7
8
9

# 包的导入

要在代码中引用其他包的内容,需要使用import关键字导入使用的包。具体语法如下:

import "包的路径"
1

注意事项:

  • import 导入语句通常放在文件开头包声明语句的下面。
  • 导入的包名需要使用双引号包裹起来。
  • 包名是从$GOPATH/src/后开始计算的,使用/进行路径分隔。
  • Go 语言中禁止循环导入包。

# 单行导入

单行导入的格式如下:

import "包1"
import "包2"
1
2

# 多行导入

多行导入的格式如下:

import (
    "包1"
    "包2"
)
1
2
3
4

# 自定义包名

在导入包名的时候,我们还可以为导入的包设置别名。通常用于导入的包名太长或者导入的包名冲突的情况。具体语法格式如下:

import 别名 "包的路径"
1

单行导入方式定义别名:

import "fmt"
import m "code.rookieops.com/package01/pkg1"

func main() {
	fmt.Println(m.Add(100, 200))
	fmt.Println(m.Mode)
}
1
2
3
4
5
6
7

多行导入方式定义别名:

import (
    "fmt"
    m "code.rookieops.com/package01/pkg1"
 )

func main() {
	fmt.Println(m.Add(100, 200))
	fmt.Println(m.Mode)
}
1
2
3
4
5
6
7
8
9

# 匿名导入包

如果某个包我们需要导入但是又不想使用里面的标识符,我们可以用匿名导入包,格式如下:

import _ "包的路径"
1

匿名导入的包与其他方式导入的包一样都会被编译到可执行文件中。

# init 函数

# 介绍

在 Go 语言程序执行时导入包语句会自动触发包内部init()函数的调用。需要注意的是: init()函数没有参数也没有返回值。 init()函数在程序运行时自动被调用执行,不能在代码中主动调用它。

# 执行顺序

Go 语言包会从main包开始检查其导入的所有包,每个包中又可能导入了其他的包。Go 编译器由此构建出一个树状的包引用关系,再根据引用顺序决定编译顺序,依次编译这些包的代码。

在运行时,被最后导入的包会最先初始化并调用其init()函数, 如下图示:f708f3d0993ae9022072d2e68fc5175b MD5

上次更新: 2025/07/18, 18:41:03
接口
文件操作

← 接口 文件操作→

最近更新
01
2025年,SRE在企业中可以做哪些事
07-18
02
SRE 如何提升自己在团队中的影响力
07-18
03
使用Go开发MCP服务
07-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式