### 類型斷言
接口類型向普通接口類型轉換,就是類型斷言。判斷 X 的類型是否是 T
>**t, ok := X.(T)**
X,接口變量
T,接口類型(string,int,bool)等
斷言成功ok = true,值t = X 只有斷言成功,才能輸入值
斷言失敗 ok = false,值t = (空的)
```
package main
import "fmt"
func checkType(t interface{}, ok bool) {
if ok {
fmt.Println("斷言成功", ok)
} else {
fmt.Println("斷言失敗", ok)
}
fmt.Printf("變量T的類型= %T,值 = %v", t, t)
}
func main() {
var x interface{} = 1
t, ok := x.(int)
checkType(t, ok)
}
結果:
斷言成功 true
變量T的類型= int,值 = 1
```
```
package main
import "fmt"
func main() {
var x interface{} = 1
t, ok := x.(int)
fmt.Println(t, ok)
}
結果:
1 true
```
如果斷言類型T是一個具體的類型,比如int,類型斷言就會X.(T)就會檢查X的動態類型是否和T相同。
如果斷言的類型T是一個接口類型,類型斷言X.(T) 檢查X的動態類是否滿足T接口
注意: 結構體里面一個變量,方法傳參不要*,比如(d *Datalist) 和(d Datalist)
```
package main
import "fmt"
// 創建一個接口類型
type Data interface {
Sing()
}
// 創建一個結構體
type Datalist struct {
Name string
}
// 方法
func (d Datalist) Sing() {
fmt.Println(d.Name, "會唱歌")
}
// 斷言
func checkType(t interface{}, ok bool) {
if ok {
fmt.Println("斷言成功", ok)
} else {
fmt.Println("斷言失敗", ok)
}
fmt.Printf("變量t的類型是 %T,值%v\r\n", t, t)
}
func main() {
//實例化結構體 var 變量名 接口名 = &結構體名{}
var d Data = &Datalist{"Pony"}
fmt.Println(d)
d.Sing()
// 第一次類型斷言
var s interface{} = Datalist{"Pony"}
t, ok := s.(string)
checkType(t, ok)
//第二次類型斷言
t1, ok := s.(Data)
checkType(t1, ok)
}
結果:
&{Pony}
Pony 會唱歌
斷言失敗 false
變量t的類型是 string,值
斷言成功 true
變量t的類型是 main.Datalist,值{Pony}
```
- 安裝開發環境
- 安裝開發環境
- 安裝詳細教程
- 引入包
- Go語言基礎
- 基本變量與數據類型
- 變量
- 數據類型
- 指針
- 字符串
- 代碼總結
- 常量與運算符
- 常量
- 運算符
- 流程控制
- if判斷
- for循環
- switch分支
- goto跳轉
- 斐波那契數列
- Go語言內置容器
- 數組
- 切片
- 映射
- 函數
- 函數(上)
- 函數(中)
- 函數(下)
- 小節
- 包管理
- 結構體
- 結構體(上)
- 結構體(中)
- 結構體(下)
- 小節
- 錯誤處理
- 錯誤處理
- 宕機
- 錯誤應用
- 小節
- 文件操作
- 獲取目錄
- 創建和刪除目錄
- 文件基本操作(上)
- 文件基本操作(中)
- 文件基本操作(下)
- 處理JSON文件
- 接口與類型
- 接口的創建與實現
- 接口賦值
- 接口嵌入
- 空接口
- 類型斷言(1)
- 類型斷言(2)
- 小節
- 并發與通道
- goroutine協程
- runtime包
- 通道channel
- 單向通道channel
- select
- 線程同步
- 多線程的深入學習
- http編程
- http簡介
- Client和Request
- get請求
- post請求
- 模塊函數方法
- 模塊
- fmt庫,模塊
- 項目練習
- 爬蟲:高三網
- 爬蟲:快代理
- 爬蟲:快代理2
- 多線程:通道思路
- 多線程爬蟲:快代理