🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 接口赋值 > 将对象实例赋值给接口 > 将一个接口赋值给另外一个接口 > 还是要研究 结构体的 实例化啊 > 当一个对象的类型是一个接口的实例时,这个对象就可以赋值给这个接口。只能将对象的指针赋值个接口变量! ``` 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会跳舞 ```