一:接口的定义
interface类型可以定义一组方法,但这些方法不需要实现。且interface不能包含任何字段,某个自定义类型(如结构体),需要用到时再具体实现该方法。
二:简单使用举例
package mainimport ( "fmt")type itf interface{ SayHello() Plud(num1 int, num2 int) int}type Personal struct{}func (p Personal) SayHello() { fmt.Println("hello world!")}func (p Personal) Plud(num1 int, num2 int) int{ return num1 + num2}func main() { var p Personal p.SayHello() res := p.Plud(1, 2) fmt.Println(res)}结果[ `go run interface.go` | done ] hello world! 3
三:接口使用细节
①:接口本身不可以创建示例,但可以指向一个实现该接口方法的自定义的类型(如结构体)
func main() { var p Personal var pp Itf = p pp.SayHello()}
②:接口中的所有方法都没没有结构体;
③:一个自定义类型需要将接口的所有方法都实现,我们就会说该自定义类型实现了该接口;
④:一个自定义类型只有实现了某个接口,才能将该自定义类型的实例赋给接口(与③结合起来);
⑤:只要是自定义类型就可以实现接口,而不单单是结构体。
package mainimport ( "fmt")type Itf interface{ Say()}type inter intfunc (i inter) Say() { fmt.Printf("这是数字%v",i)}func main() { var i inter = 1 var ii Itf = i ii.Say()}结果[ `go run interface.go` | done ] 这是数字1
⑥:一个自定义类型可以实现多个接口
package mainimport ( "fmt")type A interface{ Say()}type B interface{ Plud()}type C struct{}func (a C) Say() { fmt.Println("hello world!")}func (b C) Plud() { fmt.Println(1+1)}func main() { var c C var a A = c a.Say() var b B = c b.Plud()}结果[ `go run interface.go` | done ] hello world! 2
⑦:接口中不能有任何变量
⑧:接口也可以继承,只不过需要把所有继承的方法都要实现(包括本身的方法)
⑨:空接口interface{}可以接受任何数据类型.
func main() { var test interface{} test = 10 fmt.Println(test) test = "louis" fmt.Println(test)}结果[ `go run interface.go` | done ] 10 louis
⑩:interface默认为指针类型。
备注:如果要调用接口方法,则接口里的方法必须全部实现,无论该方法是否会被使用,否则报错。