本文主要是介绍二十、接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
接口比较抽象,它定义了一种规范,而不用关心具体实现,用通俗的话来说就仿佛一个电脑上的高清接口,只要符合这种“函数签名”的就可以使用,而不关心你用的是什么外接显示器。
1、定义接口关键词 interface
type Rebot interface {PowerOn() error
}
解释:
定义一个接口要是使用一个关键词 interface就像定义一个结构体要用struct
在接口中定义了一个接口方法叫PowerOn(),返回值为错误类型
2、一个实现接口
type T850 struct {Name string
}func (t *T850) PowerOn() error {return nil
}
前面的T850结构体与接收参数不用关心,主要是要在方法后面写上PowerOn() error来声明实现这个接口方法
3、多个实现接口
type Robot interface {PowerOn() error
}type T850 struct {Name string
}
type R2D2 struct {Broken bool
}func (t *T850) PowerOn() error {return nil
}
func (r *R2D2) PowerOn() error {if r.Broken {return errors.New("R2D2 is broken")}return nil
}func Boot(r Robot) error {return r.PowerOn()
}func main() {r := R2D2{Broken: true,}err := Boot(&r)if err != nil {fmt.Println(err)} else {fmt.Println("Robot is powered on")}t := T850{Name: "This is Terminator",}err = Boot(&t)if err != nil {fmt.Println(err)} else {fmt.Println("Robot is powered on")}
}
解释:
创建接口Rebot,在接口中创建名为PowerOn方法,返回值为go中error
创建T850与R2D2结构体
创建两个方法,实现PowerOn方法,这两个接口的接收参数不一样,方法中不一样,这里其实与java中的多态高度相似
创建Boot方法用于统一调用并返回PowerOn方法
在main方法中
首先给R2D2与T580结构体赋值
调用Boot统一调用方法并传入&r,为什么这个地方可以接受&r,因为上面有个方法接收参数中有R2D2并且声明实现PowerOn方法
同理继续调用Boot方法传入&t,为什么这个地方可以接受&t,因为上面有个方法接收参数中有T850并且声明实现PowerOn方法
最终根据逻辑判断输出结果
深入解释:
func (t *T850) PowerOn() error {return nil
}
func (r *R2D2) PowerOn() error {if r.Broken {return errors.New("R2D2 is broken")}return nil
}
在java中的多态即表示方法名一致,参数列表不一致,即根据调用方传入参数来选择具体使用哪个实现方法
在go语言中同理,在上述代码中,写了接收参数不一样声明了实现PowerOn方法,在调用时根据接收参数的不同选择不同的具体方法运行,只是相对于java这里省略了方法名称了(如果说两个方法实现同一接口方法确实可以省略掉,但是初学这里还需要适应)
在调用方法时候传入的是&t与&r,为什么要加&符号,其实这取决于,如果函数或方法的参数是指针类型(如*int
、*string
等),则需要在传递时加上&
符号,以获取变量的地址,使得函数内部可以通过指针直接修改原始值。这种区别在Go中非常重要,因为它直接影响了参数传递时是否进行值复制,以及是否能够在函数内部修改原始变量的值,但是在上述代码中实际上并没有对值进行修改。
这篇关于二十、接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!