全部教程·
Go语言·
Go语言圣经
[目录]
·
10.4. 导入声明
Go语言圣经
0.1. Go语言起源
0.2. Go语言项目
0.3. 本书的组织
0.4. 更多的信息
0.5. 致谢
1. 入门
1.1. Hello, World
1.2. 命令行参数
1.3. 查找重复的行
1.4. GIF动画
1.5. 获取URL
1.6. 并发获取多个URL
1.7. Web服务
1.8. 本章要点
2. 程序结构
2.1. 命名
2.2. 声明
2.3. 变量
2.4. 赋值
2.5. 类型
2.6. 包和文件
2.7. 作用域
3. 基础数据类型
3.1. 整型
3.2. 浮点数
3.3. 复数
3.4. 布尔型
3.5. 字符串
3.6. 常量
4. 复合数据类型
4.1 数组
4.2 Slice
4.3 Map
4.4 结构体
4.5 JSON
4.6 文本和HTML模板
5. 函数
5.1. 函数声明
5.2. 递归
5.3. 多返回值
5.4. 错误
5.5. 函数值
5.6. 匿名函数
5.7. 可变参数
5.8. Deferred函数
5.9. Panic异常
5.10. Recover捕获异常
6. 方法
6.1. 方法声明
6.2. 基于指针对象的方法
6.3. 嵌入结构体扩展类型
6.4. 方法值和表达式
6.5. 示例: Bit数组
6.6. 封装
7. 接口
7.1. 接口是合约
7.2. 接口类型
7.3. 实现接口的条件
7.4. flag.Value接口
7.5. 接口值
7.6. sort.Interface接口
7.7. http.Handler接口
7.8. error接口
7.9. 示例: 表达式求值
7.10. 类型断言
7.11. 识别错误类型
7.12. 查询接口
7.13. 类型分支
7.14. XML解码
7.15. 补充几点
8. Go协程和通道
8.1. Goroutines
8.2. 并发的Clock服务
8.3. 并发的Echo服务
8.4. Channels
8.5. 并发的循环
8.6. 并发的Web爬虫
8.7. 多路复用
8.8. 并发的字典遍历
8.9. 并发的退出
8.10. 聊天服务
9. 并发
9.1. 竞争条件
9.2. sync.Mutex互斥锁
9.3. sync.RWMutex读写锁
9.4. 内存同步
9.5. sync.Once初始化
9.6. 竞争条件检测
9.7. 并发的非阻塞缓存
9.8. Goroutines和线程
10. 包和工具
10.1. 包简介
10.2. 导入路径
10.3. 包声明
10.4. 导入声明
10.5. 包的匿名导入
10.6. 包和命名
10.7. 工具
11. 测试
11.1. go test
11.2. 测试函数
11.3. 测试覆盖率
11.4. 基准测试
11.5. 剖析
11.6. 示例函数
12. 反射
12.1. 为何需要反射
12.2. reflect.Type
12.3. 递归打印
12.4. 编码S表达式
12.5. reflect.Value修改值
12.6. 解码S表达式
12.7. 获取结构体字段
12.8. 显示类型的方法集
12.9. 几点忠告
13. 底层编程
13.1. unsafe.Sizeof
13.2. unsafe.Pointer
13.3. 深度相等判断
13.4. cgo调用C代码
13.5. 几点忠告
Go语言圣经
0.1. Go语言起源
0.2. Go语言项目
0.3. 本书的组织
0.4. 更多的信息
0.5. 致谢
1. 入门
1.1. Hello, World
1.2. 命令行参数
1.3. 查找重复的行
1.4. GIF动画
1.5. 获取URL
1.6. 并发获取多个URL
1.7. Web服务
1.8. 本章要点
2. 程序结构
2.1. 命名
2.2. 声明
2.3. 变量
2.4. 赋值
2.5. 类型
2.6. 包和文件
2.7. 作用域
3. 基础数据类型
3.1. 整型
3.2. 浮点数
3.3. 复数
3.4. 布尔型
3.5. 字符串
3.6. 常量
4. 复合数据类型
4.1 数组
4.2 Slice
4.3 Map
4.4 结构体
4.5 JSON
4.6 文本和HTML模板
5. 函数
5.1. 函数声明
5.2. 递归
5.3. 多返回值
5.4. 错误
5.5. 函数值
5.6. 匿名函数
5.7. 可变参数
5.8. Deferred函数
5.9. Panic异常
5.10. Recover捕获异常
6. 方法
6.1. 方法声明
6.2. 基于指针对象的方法
6.3. 嵌入结构体扩展类型
6.4. 方法值和表达式
6.5. 示例: Bit数组
6.6. 封装
7. 接口
7.1. 接口是合约
7.2. 接口类型
7.3. 实现接口的条件
7.4. flag.Value接口
7.5. 接口值
7.6. sort.Interface接口
7.7. http.Handler接口
7.8. error接口
7.9. 示例: 表达式求值
7.10. 类型断言
7.11. 识别错误类型
7.12. 查询接口
7.13. 类型分支
7.14. XML解码
7.15. 补充几点
8. Go协程和通道
8.1. Goroutines
8.2. 并发的Clock服务
8.3. 并发的Echo服务
8.4. Channels
8.5. 并发的循环
8.6. 并发的Web爬虫
8.7. 多路复用
8.8. 并发的字典遍历
8.9. 并发的退出
8.10. 聊天服务
9. 并发
9.1. 竞争条件
9.2. sync.Mutex互斥锁
9.3. sync.RWMutex读写锁
9.4. 内存同步
9.5. sync.Once初始化
9.6. 竞争条件检测
9.7. 并发的非阻塞缓存
9.8. Goroutines和线程
10. 包和工具
10.1. 包简介
10.2. 导入路径
10.3. 包声明
10.4. 导入声明
10.5. 包的匿名导入
10.6. 包和命名
10.7. 工具
11. 测试
11.1. go test
11.2. 测试函数
11.3. 测试覆盖率
11.4. 基准测试
11.5. 剖析
11.6. 示例函数
12. 反射
12.1. 为何需要反射
12.2. reflect.Type
12.3. 递归打印
12.4. 编码S表达式
12.5. reflect.Value修改值
12.6. 解码S表达式
12.7. 获取结构体字段
12.8. 显示类型的方法集
12.9. 几点忠告
13. 底层编程
13.1. unsafe.Sizeof
13.2. unsafe.Pointer
13.3. 深度相等判断
13.4. cgo调用C代码
13.5. 几点忠告
10.4. 导入声明
可以在一个Go语言源文件包声明语句之后,其它非导入声明语句之前,包含零到多个导入包声明语句。每个导入声明可以单独指定一个导入路径,也可以通过圆括号同时导入多个导入路径。下面两个导入形式是等价的,但是第二种形式更为常见。
import "fmt"
import "os"
import (
"fmt"
"os"
)
导入的包之间可以通过添加空行来分组;通常将来自不同组织的包独自分组。包的导入顺序无关紧要,但是在每个分组中一般会根据字符串顺序排列。(gofmt和goimports工具都可以将不同分组导入的包独立排序。)
import (
"fmt"
"html/template"
"os"
"golang.org/x/net/html"
"golang.org/x/net/ipv4"
)
如果我们想同时导入两个有着名字相同的包,例如math/rand包和crypto/rand包,那么导入声明必须至少为一个同名包指定一个新的包名以避免冲突。这叫做导入包的重命名。
import (
"crypto/rand"
mrand "math/rand" // alternative name mrand avoids conflict
)
导入包的重命名只影响当前的源文件。其它的源文件如果导入了相同的包,可以用导入包原本默认的名字或重命名为另一个完全不同的名字。
导入包重命名是一个有用的特性,它不仅仅只是为了解决名字冲突。如果导入的一个包名很笨重,特别是在一些自动生成的代码中,这时候用一个简短名称会更方便。选择用简短名称重命名导入包时候最好统一,以避免包名混乱。选择另一个包名称还可以帮助避免和本地普通变量名产生冲突。例如,如果文件中已经有了一个名为path的变量,那么我们可以将"path"标准包重命名为pathpkg。
每个导入声明语句都明确指定了当前包和被导入包之间的依赖关系。如果遇到包循环导入的情况,Go语言的构建工具将报告错误。
下一章:10.5. 包的匿名导入
如果只是导入一个包而并不使用导入的包将会导致一个编译错误。但是有时候我们只是想利用导入包而产生的副作用:它会计算包级变量的初始化表达式和执行导入包的init初始化函数(2.6.2)。这时候我们需要抑制“unused ...
AI 中文社