接口
在Go语言中接口(interface)是一种类型,一种抽象的类型。
interface(接口)是golang最重要的特性之一,实现多态。Interface类型可以定义一组方法 ,但是这些不需要实现。并且interface不能包含任何变量 。
本篇主要来源这里
接口定义和实现 接口定义 1 2 3 4 5 6 / 定义一个动物接口,接口中有个方法名称,但是不具体实现 type Animal interface { Say() GetName() string }
接口实现
一个对象只要全部实现了接口中的方法,那么就实现了这个接口。换句话说,接口就是一个需要实现的方法列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 type Dog struct { Name string } type Cat struct { Name string } func (d Dog) Say() { fmt.Println("汪汪汪" ) } func (d Dog) GetName() string { return d.Name } func (c Cat) Say() { fmt.Println("喵喵喵" ) } func (c Cat) GetName() string { return c.Name }
完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 \\ hello_work/iinterface/studyInterface.go package iinterfaceimport "fmt" type Animal interface { Say() GetName() string } type Dog struct { Name string } type Cat struct { Name string } func (d Dog) Say() { fmt.Println("汪汪汪" ) } func (d Dog) GetName() string { return d.Name } func (c Cat) Say() { fmt.Println("喵喵喵" ) } func (c Cat) GetName() string { return c.Name }
接口类型变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package mainimport ( "fmt" "example.com/hello_work/hello_work/iinterface" ) func main () { var animal iinterface.Animal dog := iinterface.Dog{Name: "旺财" } animal = dog dogName := animal.GetName() fmt.Println(dogName) animal.Say() cat := iinterface.Cat{Name: "工程喵" } animal = cat catName := animal.GetName() fmt.Println(catName) animal.Say() }
1 2 3 4 5 PS E:\proj\gowork> go run .\hello_work\main.go 旺财 汪汪汪 工程喵 喵喵喵
注意,如果实现了接口中的方法(studyInterface.go)用的是指针,如func (d *Dog),那么对应实例化时也要传入指针,dog := &iinterface.Dog{Name: “旺财”}
空接口
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 func main () { var x interface {} s := "pprof.cn" x = s fmt.Printf("type:%T value:%v\n" , x, x) i := 100 x = i fmt.Printf("type:%T value:%v\n" , x, x) b := true x = b fmt.Printf("type:%T value:%v\n" , x, x) }
1 2 3 4 func show (a interface {}) { fmt.Printf("type:%T value:%v\n" , a, a) }
1 2 3 4 5 6 var studentInfo = make (map [string ]interface {}) studentInfo["name" ] = "李白" studentInfo["age" ] = 18 studentInfo["married" ] = false fmt.Println(studentInfo)