### 接口賦值
> 將對象實例賦值給接口
> 將一個接口賦值給另外一個接口
> 還是要研究 結構體的 實例化啊
>
當一個對象的類型是一個接口的實例時,這個對象就可以賦值給這個接口。只能將對象的指針賦值個接口變量!
```
package main
import (
"fmt"
)
// 聲明接口 和所帶的方法
type Data interface {
sing() error
dance() error
}
// 聲明一個結構體
type Show struct {
Name string
}
// 接口實現的方法
func (show *Show) Sing() error {
fmt.Println(show.Name + "會唱歌")
return nil
}
func (show *Show) dance() error {
fmt.Println(show.Name + "會跳舞")
return nil
}
// 調用接口
func main() {
// 實例化結構體
// po := new(Show)
// po.Name = "Pony"
var po = &Show{Name: "Pony"}
// 調用方法
po.Sing()
po.dance()
}
結果:
Pony會唱歌
Pony會跳舞
```
### 接口賦值接口
> **A,B兩個接口不相同,接口A的方法集是接口B方法集的子集,那么接口B可以賦值給接口A。**
```
package main
import (
"fmt"
"reflect"
)
// 聲明 一個接口和方法
type Data interface {
Sing()
dance()
}
// 再聲明一個接口
type Getdata interface {
dance()
}
// 聲明一個結構體
type Show struct {
Name string
}
func (s *Show) Sing() {
fmt.Println(s.Name + "會唱歌")
}
func (s *Show) dance() {
fmt.Println(s.Name + "會跳舞")
}
func main() {
// 這里結構體實例化
var pe = &Show{Name: "Pony"}
fmt.Println(reflect.TypeOf(pe)) // *main.Show
// 這里需要聲明 一個變量po 類型 是接口 Getdata
var po Getdata
fmt.Println(reflect.TypeOf(po)) // <nil>
// 然后賦值
po = pe
fmt.Println(reflect.TypeOf(po)) // *main.Show
// 這里就有意思了 po.sing()調用報錯了
// 因為 接口 Getdata 里面只有 dance()這個方法,而po是 Getdata聲明的變量
po.dance()
}
結果:
*main.Show
<nil>
*main.Show
Pony會跳舞
```
- 安裝開發環境
- 安裝開發環境
- 安裝詳細教程
- 引入包
- Go語言基礎
- 基本變量與數據類型
- 變量
- 數據類型
- 指針
- 字符串
- 代碼總結
- 常量與運算符
- 常量
- 運算符
- 流程控制
- if判斷
- for循環
- switch分支
- goto跳轉
- 斐波那契數列
- Go語言內置容器
- 數組
- 切片
- 映射
- 函數
- 函數(上)
- 函數(中)
- 函數(下)
- 小節
- 包管理
- 結構體
- 結構體(上)
- 結構體(中)
- 結構體(下)
- 小節
- 錯誤處理
- 錯誤處理
- 宕機
- 錯誤應用
- 小節
- 文件操作
- 獲取目錄
- 創建和刪除目錄
- 文件基本操作(上)
- 文件基本操作(中)
- 文件基本操作(下)
- 處理JSON文件
- 接口與類型
- 接口的創建與實現
- 接口賦值
- 接口嵌入
- 空接口
- 類型斷言(1)
- 類型斷言(2)
- 小節
- 并發與通道
- goroutine協程
- runtime包
- 通道channel
- 單向通道channel
- select
- 線程同步
- 多線程的深入學習
- http編程
- http簡介
- Client和Request
- get請求
- post請求
- 模塊函數方法
- 模塊
- fmt庫,模塊
- 項目練習
- 爬蟲:高三網
- 爬蟲:快代理
- 爬蟲:快代理2
- 多線程:通道思路
- 多線程爬蟲:快代理