开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:Go 接口课堂练习题】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9702
Go接口课堂练习题
内容介绍:
一、第一个案例
二、第二个案例
三、第三个案例
一、第一个案例
下面代码,有没有错误,能得出什么结论?
//对应了 A 接口,
有两个方法:
Test010和Test020
type Alntertace intertace
Test010
Test020
//对应了 B 接口,
有两个方法:
Test010和 Test030
type Binterface interface
Test010
Test030
type Stu struct
func (stu Stu) Test010
func (stu Stu) Test020
func (stu Stu) Test030
func main
stu-Stu//变量对应类型,实现了 a 和 b 的方法,方法要完全一样。
var a Alnterface=stu
var b Bintertace=stu
fmt. Printin ("ok-",a,b)
注意:
这是把 stu 提供给 A/B 接口,方法要完全一样才行,参数类型和参数值都要一样,既实现了 b 里面的 test01又实现了了 a 里面的 test01。
结论:
在实现接口的时候,标准只看函数而不是看哪个接口,接口是基于方法的。
二、第二个案例
下面代码,有没有错误,你能得出什么结论?
//对应了A接口,有两个方法:
Test010和 Test020
type Alnterface interface{
Test01 ()
Test02 ()
//对应了 A 接口,有两个方法:
Test010和 Test020
type Binterface interface
Test01
Test03
//把 a 和 b 两个接口,都放到了 c 接口,继承了。
此时问题比较严重了。
相当于在 c 接口里有两个完全相同的 test01,会报错。
无论有多少接口,都不能重合,这里便产生编译错误的后果,因为 Cinterface 中有两个相同的 test01,不能有两个完全一样的接口名,否则编译器会报错。
type Cinterface interface{
Alnterface
Binterface
funcmain ()
//所以这里编译错误,因为 Cnterface 有两个 Test01(),编译器不能通过!
三、第三个案例
//下面代码,有没有错误,为什么?
type Usb interface
Say()
type Stu struct {}
//以上还没有错误
func (this *Stu) Say()
fmt.Println("Say()")
func main() {
var stu Stu = Stu//
错误!会报 Stu 类型没有实现 Usb 接口
var u Usb = stu
u.Say()
fmt.PrintIn("here", u)
//此段代码是错误的,一定会报错:
Stu 这个类型没有实现USB接口。
改正:
加个地址就成功。其他没有变化,指针直接调没有问题,运行后是正确的。
改正结果:
//错误!会报 Stu 类型没有实现Usb接口
//如果希望通过编译,var u Usb=stu
var stu Stu = Stu//
错误!会报 Stu 类型没有实现 Usb 接口
var u Usb = stu