[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