本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Golang如何实现接口
接口,interface,很多OO语言都会对接口设计的很好,不过其实这个概念不是只有OO才有的。接口实际上是一个抽象概念,任何语言,或者·模块,都可以用到接口的设计思想。
这里我们讨论的接口,主要是指的go语言中关键字interface的实现,这个关键字实现了一些接口的功能。下面的代码只要看完,就很容易理解它的用法和目的了。
接口法参数和值拷贝
另外就是在go语言中,其接口的实现和Java是完全不一样的,刚开始用的话,我记得当时很容易混乱。其原因就在于实现了接口的方法,传递的到底是指针呢,还是引用呢,还是值拷贝呢?其实如果熟悉其指针或者引用的用法的话,这个看起来就比较顺眼了。
package main
type I interface {
tt()
pp()
}
func (a *A) tt() {
println(&(a.b))
}
func (a A) pp() {
println(&(a.b))
}
type A struct {
b *B
}
type B struct {
bb string
}
func test(a I) {
a.tt()
}
func test1(a *I) {
aa := *a
aa.tt()
}
func NewI() I {
return &A{
b: &B{bb: "bb"},
}
}
type C struct {
i I
}
func main() {
a := NewI()
switch v := a.(type) {
case *A:
println(&(v.b))
v.pp()
}
c := &C{i: a}
test(a)
test1(&a)
c.i.tt()
}
输出: 0xc00000e010 0xc000032760 0xc00000e010 0xc00000e010 0xc00000e010
大家自己体会一下。
interface 简介
一个接口是一组函数签名,它是一个特定的类型。另一种类型通过实现接口的功能来实现接口。虽然像Java或C#这样的语言明确地实现了接口,但在Go中却没有明确的意图声明。
接口的主要任务是只提供由名称、输入参数和返回类型组成的函数签名。由一个类型(如结构类型)来实现函数。
接口也被称为暴露的API或合约。如果一个类型实现了一个可排序接口的函数(API),我们就知道它可以被排序;它遵守了可排序的契约。
接口指定了行为。一个接口只包含函数的签名,但不包含它们的实现。
使用接口可以使代码更清晰、更简短、更易读。