首页 > 代码库 > go语言中的接口interface

go语言中的接口interface

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