### 接口赋值
> 将对象实例赋值给接口
> 将一个接口赋值给另外一个接口
> 还是要研究 结构体的 实例化啊
>
当一个对象的类型是一个接口的实例时,这个对象就可以赋值给这个接口。只能将对象的指针赋值个接口变量!
```
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
- 多线程:通道思路
- 多线程爬虫:快代理