接口与结构体接口声明接口的嵌套接口与结构体01.03.02.目录类型断言04.01接口声明•接口定义•接口特点•接口格式•空接口•error接口•接口是对类型行为的约定•接口是一系列方法的集合•接口是一种高度抽象的数据类型•接口中的方法不包含代码•接口中的方法是抽象的•接口中不包含变量•本质是一种关于对象功能的约定接口的定义•接口是双方约定的一种合作协议,接口实现者不需要关心接口会怎样被使用,只需要实现接口里面所有的方法即可•接口不支持直接实例化,只能通过具体的类来实现声明的所有方法,同时函数的函数名、函数参数和函数返回值必须完全一样•Go语言中的接口支持赋值操作,从而快速实现接口与实现类的映射接口的特点1接口声明type接口类型名interface{方法名1(参数列表1)返回值列表1方法名2(参数列表2)返回值列表2......}标准格式声明接口•接口类型名:使用type将接口定义为自定义的类型名,接口在命名时,一般会在单词后面添加er;•方法名:当方法名首字母是大写时,同时接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问;•参数列表:表示传入到方法中的值;•返回值列表:方法返回值。typePhoneinterface{call()SendMsg(msgstring)bool}语法要点1接口声明type接口类型名interface{方法名1(参数列表1)返回值列表1方法名2(参数列表2)返回值列表2......}type(变量名类型)方法名1(参数列表1)返回值列表1{}type(变量名类型)方法名2(参数列表2)返回值列表2{}标准格式接口的实现//标准格式接口的实现案列typeAndroidPhonestruct{}func(aAndroidPhone)call(){fmt.Println("AndroidPhonecalling")}func(aAndroidPhone)SendMsg(msgstring)bool{fmt.Println("AndroidPhonesendingmsg")returntrue}1接口声明•是接口类型的特殊形式•空接口没有任何方法,因此任何类型都无须实现空接口•从实现的角度看,任何值都满足这个接口的需求•空接口类型可以保存任何值,也可以从空接口中取出原值空接口packagemainimport"fmt"funcmain(){varanyinterface{}any=1fmt.Println(any)any="hello"fmt.Println(any)any=falsefmt.Println(any)}1接口声明运行结果为:1hellofalse•作为错误处理的标准模式•如果函数要返回错误,则返回值类型列表中肯定包含error•error处理过程类似于C语言中的错误码,可逐层返回,直到被处理error接口packagemainimport("errors""fmt""math")funcSqrt(ffloat64)(float64,error){iff<0{return-1,errors.New("开平方根的数字不能小于0")}returnmath.Sqrt(f),nil}funcmain(){result,err:=Sqrt(-13)iferr!=nil{fmt.Println(err)}else{fmt.Println(result)}}1接口声明运行结果为:开平方根的数字不能小于002接口与结构体•接口与结构体的关系•一个结构体类型实现多个接口•一个接口被多个结构体实现接口与结构体关系接口和结构体类型之间是多对多的关系一个结构体类型可以实现多个接口一个接口也可以被多个结构体类型所实现2接口与结构体type接口类型名1interface{方法名1(参数列表1)返回值列表1}type接口类型名2interface{方法名2(参数列表2)返回值列表2}一个结构体类型实现多个接口2接口与结构体type结构体struct{字段名1字段类型1字段名2字段类型2}type(结构体名结构体)方法名1(参数列表1)返回值列表1{}type(结构体名结构体)方法名2(参数列表2)返回值列表2{}2接口与结构体packagemainimport"fmt"typeruninterface{running(timeint)int}typeeatinterface{eating(foodstring)int}typepersonstruct{weightint}func(p*person)running(timeint)int{p.weight-=time/5returnp.weight}func(p*person)eating(foodstring)int{p.weight+=1returnp.weight}funcmain(){p1:=&person{weight:50,}fmt.Println(p1.weight)p1.running(20)fmt.Println(p1.weight)p1.eating("面包")fmt.Println(p1.weight)}运行结果为:5046472接口与结构体一个接口被多个结构体实现type接口类型名interface{方法名1(参数列表1)返回值列表1方法名2(参数列表2)返回值列表2}type结构体1struct{字段名1字段类型1}type结构体2struct{字段名2字段类型2}type结...