在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Go语言提供了另外一种数据类型,即接口,它把所有具有共性的方法定义在一起, type Talk interface { Hello(userName string) string Talk(heard string) (saying string,end bool,err error) } type、接口类型名称、interface以及由花括号包裹的方法声明集合,共同组成了一个接口类型声明。 //定义接口 type interface_name interface { method_name1 [return_type] method_name2 [return_type] method_name3 [return_type] ... method_namen [return_type] } //定义结构体 type struct_name struct { /**/ } //实现接口方法 func (struct_name_var struct_name) method_name1() [return_type] { /*方法实现*/ } func (struct_name_var struct_name) method_name2() [return_type] { /*方法实现*/ }
简单实例: package main import ( "fmt" ) //定义一个Phone接口 type Phone interface { call() //接口中有一个call方法 } //定义诺基亚结构体 type NokiaPhone struct { } //实现call方法 func (nokkiaPhone NokiaPhone) call() { fmt.Println("I am Nokia") } //定义苹果结构体 type Iphone struct { } //实现call方法 func (iphone Iphone) call() { fmt.Println("I am iphone") } func main() { //根据接口声明变量 var phone Phone //同一个接口变量就能实现多个结构体中的方法 phone = new(NokiaPhone) //创建一个指定类型的值,并返回该值的指针 phone.call() phone = new(Iphone) phone.call() } /* I am Nokia I am iphone */
编译器会根据方法集来判断是否实现了接口。 package main import "fmt" type tester interface { test() string string() string } type data struct{} //定义结构体 func (*data) test() string { return "5678" } //实现test方法 func (data) string() string { //实现string return "aaaaaaaaa" } func main() { var d data var t tester = &d // fmt.Println(t.test()) //不论是data和*data都是指代同一个程序实体 fmt.Println(t.string()) }
可以像匿名字段那样,嵌入其它接口。 package main import "fmt" type stringer interface { string() string } type tester interface { test() string stringer } type data struct{} //定义结构体 func (*data) test() string { return "5678" } //实现test方法 func (data) string() string { return "aaaaaaaaa" } func main() { var d data var t tester = &d // fmt.Println(t.test()) fmt.Println(t.string()) } package main import "fmt" type stringer interface { string() string } type tester interface { test() string stringer } type data struct{} func (*data) test() string { return "5678" } func (data) string() string { return "aaaaaaaaa" } func pp(a string) { fmt.Println(a.string()) } func main() { var d data var t tester = &d pp(t) var s stringer = t fmt.Println(s.string()) }
支持匿名接口类型,可直接用于变量定义,或作为结构字段类型。 package main import "fmt" type data struct{} //结构体data func (data) string() string { return "123456" } type node struct { data interface { //字段类型为接口 string() string } } func main() { var t interface { //变量t为接口类型 string() string } = data{} //空结构体 n := node{ data: t, } fmt.Println(n.data.string()) //123456 }
类型推断可将接口变量还原为原始类型,或用来判断是否实现了某个更具体地接口类型。 package main import "fmt" type data int func (d data) String() string { //方法 return fmt.Sprintf("data:%d", d) } func main() { var d data = 15 var x interface{} = d if n, ok := x.(fmt.Stringer); ok { fmt.Println(n) } if d2, ok := x.(data); ok { fmt.Println(d2) } e := x.(error) fmt.Println(e) } /* data:15 data:15 panic: interface conversion: main.data is not error: missing method Error */
|
请发表评论