Go基础学习-interface

interface

Go语言中接口(interface)是一种类型,一种抽象的类型;是一组method的集合;接口做的事情就像是定义一个协议(规则),只要满足他的方法,就认为其是该类型,不关心属性(数据),只关心行为(方法);

/*
type 接口类型名 interface{
    方法名1( 参数列表1 ) 返回值列表1
    方法名2( 参数列表2 ) 返回值列表2
    …
}
接口名:使用type将接口定义为自定义的类型名。Go语言的接口在命名时,一般会在单词后面添加er,如有写操作的接口叫Writer,有字符串功能的接口叫Stringer等。接口名最好要能突出该接口的类型含义。
方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。
参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以省略。
*/
type writer interface{
    Write([]byte) error
}
/*
接口的实现
只要实现了该接口中的所有方法,就实现了这个接口类;换句话说,接口就是一个需要实现的方法列表
*/
type Phoner interface {
	Call()
}
type AppPhone struct {
}
func (a *AppPhone)Call(){
	return
}
//AppPhone这个结构体实现了Call方法就认为其实现了Phoner类,Phoner类型的变量能够存储AppPhone类型的变量。
/*
使用值接收者实现接口和使用指针接收者实现接口的区别
1.指针类型实现了该接口方法,那该接口只可以接受该类型的指针,不可以接受该类型的值类型
2.值类型实现了该接口方法,那该接口即可以接受该类型的指针类型,也可以接受该类型的值类型
*/
//值接收者
type Phoner interface {
	call()
	}
type AppPhone struct {
}
func (a AppPhone)call(){
	return
}
func main(){
	var p Phoner
	a:=AppPhone{}
	p=a//p可以接收a类型
	a1:=&AppPhone{}
	p=a1///p可以接收*a类型
}
//指针接收者
type Phoner interface {
	call()
	}
type AppPhone struct {
}
func (a *AppPhone)call(){
	return
}
func main(){
	var p Phoner
	a:=AppPhone{}
	p=a//p不可以接收a类型
	a1:=&AppPhone{}
	p=a1///p只可以接收*a类型
}
//接口的嵌套
type Phoner interface {
	Call()
}
type Emailer interface {
	Email()
}
type Tooler interface{
	Phoner 
	Emailer 
}
type AppPhone struct{
	type string
}
func (a AppPhone)Call{
}
func (a AppPhone)Email{
}

func main(){
	var t Tooler 
	a:=AppPhone{}
	t=a
	t.Call()
	t.Email()
}

//空接口;可以存储任何的变量;但是在获取其具体存储的值时需要断言
var a interface{}
//只有此时a==nil
//------------------------
//接口的断言
//------------------------
func main() {
	var inter interface{} //定义一个空接口
	inter = 100
	//接口的断言
	//1.x.(T)
	v1, ok := inter.(int8)
	if !ok {
		fmt.Println("bad choice!", v1)
	} else {
		fmt.Println("good choice", v1)
	}
	//switch判断
	switch v2 := inter.(type) {
	case int8:
		fmt.Println("int8", v2)
	case int16:
		fmt.Println("int16", v2)
	case string:
		fmt.Println("string", v2)
	case int:
		fmt.Println("int", v2)
	default:
		fmt.Println("no choice", v2)
	}
}

  • go提倡面向接口编程
  • 只有当有两个或两个以上的具体类型必须以相同的方式进行处理时才需要定义接口。不要为了接口而写接口,那样只会增加不必要的抽象,导致不必要的运行时损耗。

猜你喜欢

转载自blog.csdn.net/wzb_wzt/article/details/107378979
今日推荐