Golang 接口的使用及注意细节
Go语言声明接口如下:
type Student interface{
speak()
eat()
}
注意:
- 接口的方法必须要全部实现
- 接口本身不能创建是实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)
- 只要是自定义类型,就可以实现接口,不仅仅是结构体类型
- 接口中所有的方法都没有方法体,都是没有实现的方法,举例说明:
package main import "fmt" type TestInterface interface{ Speak() } type Stu struct{ Name string } func(s Stu)Say(){ fmt.Println("Stu Say()") } type interger int func(i interger)Say(){ fmt.Println("interger Say()") } func main(){ var stu Stu //结构体变量 实现了 Say()方法 也就实现了 TestInterface var a TestInterface = stu a.Say() //非结构体也可以实现接口 var i interger = 100 var b TestInterface = i b.Say() } - 一个自定义类型可以实现多个接口
//接口 Carver1 type Carver1 interface{ Say() } //接口 Carver2 type Carver2 interface{ Hello() } type CarverSelf struct{ } func(c *CarverSelf)Say(){ fmt.Println("CarverSelf Say") } func(c *CarverSelf)Hello(){ fmt.Println("CarverSelf Hello") } func main(){ //CarverSelf 实现了 Carver1 和 Carver2 接口 var carver CarverSelf var a Carver1 = carver var b Carver1 = carver a.Say() b.Hello() } - 接口中不能有任何变量
//接口 Carver1 type Carver1 interface{ //Name string 不能有这样的变量 Say() } - 一个接口(接口A)可以继承多个别的接口(接口B、C),这时如果要实现接口A,就必须将接口B、C的方法也全部实现
package main import "fmt" type BInterface interface{ test1() } type CInterface interface{ test2() } //里面的接口都要全部实现,否则编译不通过 type AInterface interface{ BInterface CInterface test3() } type Stu struct{ } //方法test1【缺一不可】 func(stu Stu)test1(){ } //方法test2【缺一不可】 func(stu Stu)test2(){ } //方法test3【缺一不可】 func(stu Stu)test3(){ } type G interface{ } func main(){ var stu Stu var a AInterface = stu a.test1() //stu默认实现了空接口 写法1 var g1 G = stu fmt.Println(g1) //输出 nil //写法2 var g2 interface{} = stu fmt.Println(g2) //输出 nil //其它类型也可以 var num float64 = 1.2 g1 = num g2 = num fmt.Println(g1,g2)//输出两个1.2 } - interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用那么会输出nil
- 空接口interface{}没有任何方法,所以所有类型都实现了空接口,即可以把任何一个变量赋给空接口
本文来自博客园,作者:Carver大脸猫,转载请注明原文链接:https://www.cnblogs.com/carver/articles/18453121

浙公网安备 33010602011771号