[TOC]
## 空接口定义
空接口是指没有定义任何方法的接口类型。因此任何类型都可以视为实现了空接口。也正是因为空接口类型的这个特性,空接口类型的变量可以存储任意类型的值。
```go
/*
var i interface{}
等价于
type Any interface{}
var i Any
*/
var i interface{}
// 整型
i = 1
fmt.Printf("i: %v, type: %T\n", i, i)
// 浮点数
i = 1.35
fmt.Printf("i: %v, type: %T\n", i, i)
// 字符串
i = "jiaxzeng"
fmt.Printf("i: %v, type: %T\n", i, i)
// 布尔值
i = true
fmt.Printf("i: %v, type: %T\n", i, i)
// 切片
i = []string{"jiaxzeng", "xiaodunan"}
fmt.Printf("i: %v, type: %T\n", i, i)
// map 映射
i = map[int]string{1: "jiaxzeng"}
fmt.Printf("i: %v, type: %T\n", i, i)
// 指针
x := "jiaxzeng"
i = &x
fmt.Printf("i: %v, type: %T\n", i, i)
// 运行结果:
// i: 1, type: int
// i: 1.35, type: float64
// i: jiaxzeng, type: string
// i: true, type: bool
// i: [jiaxzeng xiaodunan], type: []string
// i: map[1:jiaxzeng], type: map[int]string
// i: 0xc000010290, type: *string
```
## 空接口应用
### 空接口作为函数的参数
使用空接口实现可以接收任意类型的函数参数。
```go
func showType(x interface{}) {
fmt.Printf("x is value: %v, x is type: %T\n", x, x)
}
func main() {
showType(1)
showType("jiaxzeng")
showType(1.5)
showType([]string{"jiaxzeng"})
showType(map[string]string{"name": "jiaxzeng"})
x := 18
showType(&x)
}
// 运行结果:
// x is value: 1, x is type: int
// x is value: jiaxzeng, x is type: string
// x is value: 1.5, x is type: float64
// x is value: [jiaxzeng], x is type: []string
// x is value: map[name:jiaxzeng], x is type: map[string]string
// x is value: 0xc0000ba010, x is type: *int
```
### 空接口作为map的值
使用空接口实现可以保存任意值的字典。
```go
m := make(map[string]interface{})
m["name"] = "jiaxzeng"
m["age"] = 18
m["course"] = []string{"Kubernetes", "Golang", "Python"}
fmt.Printf("m: %v\n", m)
```
- Golang简介
- 开发环境
- Golang安装
- 编辑器及快捷键
- vscode插件
- 第一个程序
- 基础数据类型
- 变量及匿名变量
- 常量与iota
- 整型与浮点型
- 复数与布尔值
- 字符串
- 运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 流程控制语句
- 获取用户输入
- if分支语句
- for循环语句
- switch语句
- break_continue_goto语法
- 高阶数据类型
- pointer指针
- array数组
- slice切片
- slice切片扩展
- map映射
- 函数
- 函数定义和调用
- 函数参数
- 函数返回值
- 作用域
- 函数形参传递
- 匿名函数
- 高阶函数
- 闭包
- defer语句
- 内置函数
- fmt
- strconv
- strings
- time
- os
- io
- 文件操作
- 编码
- 字符与字节
- 字符串
- 读写文件
- 结构体
- 类型别名和自定义类型
- 结构体声明
- 结构体实例化
- 模拟构造函数
- 方法接收器
- 匿名字段
- 嵌套与继承
- 序列化
- 接口
- 接口类型
- 值接收者和指针接收者
- 类型与接口对应关系
- 空接口
- 接口值
- 类型断言
- 并发编程
- 基本概念
- goroutine
- channel
- select
- 并发安全
- 练习题
- 第三方库
- Survey
- cobra