package main;import "fmt"//接口interface//接口是一个或多个方法签名的集合//只要某个类型拥有该接口的所有方法签名,即算实现该接口。//接口只有方法声明,没有实现,没有数据字段//接口可以匿名嵌入其它接口,或嵌入到结构中。//GO语言中的所有类型都实现了空接口type Empty interface {}type Inf interface { getname() string; setname(name string);}type InfB interface { //这里把INF接口嵌入 Inf; getAge() int; setAge(age int);}type A struct { name string;}type B struct { name string; age int;}//结构A实现Inf的接口func (a *A) getname() string { return a.name;}func (a *A) setname(name string) { a.name = name;}//结构B实现InfB的接口func (b *B) getname() string { return b.name;}func (b *B) setname(name string) { b.name = name;}func (b *B) getAge() int { return b.age;}func (b *B) setAge(age int) { b.age = age;}//函数test接收一个INF类型的变量func test(i Inf) { fmt.Println("ok");}//这里使用空接口类型接收参数func test2(e Empty) { //判断属于哪个接口 if a,ok := e.(Inf); ok { fmt.Println(a,"inf"); } else if a,ok := e.(InfB); ok { fmt.Println(a,"infb") }}//同上,另一种写法func test3(e Empty) { switch a := e.(type) { case Inf: fmt.Println(a,"inf"); case InfB: fmt.Println(a,"infb"); default: fmt.Println(a,"no"); }}func main() { a := A{}; a.setname("test"); fmt.Println(a,a.getname()); //注意这里需要用取地址符,因为上面的方法绑定都是(a *A) test(&a); test2(&a); test3(&a); b := B{}; b.setname("testb"); b.setAge(25); fmt.Println(b.getname(),b.getAge()); //结构B实现了Inf和InfB两个接口 test(&b); test2(&b); test3(&b); //接口InfB可以转化为Inf,但Inf不能转化为InfB //只能从超集向子集转 c := B{}; //注意这里要传地址 var d Inf = Inf(&c); d.setname("testc"); fmt.Println(d,d.getname());}
总结
以上是内存溢出为你收集整理的go语言中的接口interface全部内容,希望文章能够帮你解决go语言中的接口interface所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)