Go语言编程(十五)之接口

释放双眼,带上耳机,听听看~!

   接口在Go语言有着至关重要的地位。如果说goroutine和channel是支撑起Go语言的并发模型的基石,让Go语言在如今集群化与多核化的时代成为一道极为亮丽的风景,那么接口是Go语言整个类型系统的基石,让Go语言在基础编程哲学的探索上达到前所未有的高度。

   Go语言在编程哲学上是变革派,而不是改良派。这不是因为Go语言有goroutine和channel,而更重要的是因为Go语言的类型系统,更是因为Go语言的接口。Go语言的编程哲学因为有接口而趋近完美。
Go 语言的接口不单单只是接口,下面我们通过一系列对比来进一步探索Go语言的接口特性。

其他语言的接口

   Go语言的接口并不是其他语言(C++、Java、C#等)中所提供的接口概念。

   在Go语言出现之前,接口主要作为不同组件之间的契约存在。对契约的实现是强制的,你必须声明你的确实现了该接口。为了实现一个接口,你需要从该接口继承:


1
2
1interface IFoo {
2

1
2
1    void Bar();
2

1
2
1}
2

1
2
1class Foo implements IFoo { // Java
2

1
2
1    // ...
2

1
2
1}
2

1
2
1class Foo : public IFoo { // C++
2

1
2
1    // ...
2

1
2
1}
2

1
2
1IFoo* foo = new Foo;
2

1
2
1 即使另外有一个接口IFoo2实现了与IFoo完全一样的接口方法甚至名字也叫IFoo只不过位于不同的名字空间下,编译器也会认为上面的类Foo只实现了IFoo而没有实现IFoo2接口。
2

这类接口我们称之为侵入式接口。“侵入式”的主要表现在于实现类需要明确声明自己实现了某个接口。

非侵入式接口

   在Go语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口,例如:


1
2
1type File struct {
2

1
2
1    // ...
2

1
2
1}
2

1
2
1func (f *File) Read(buf []byte) (n int, err error)
2

1
2
1func (f *File) Write(buf []byte) (n int, err error)
2

1
2
1func (f *File) Seed(off int64, whence int) (pos int64, err error)
2

1
2
1func (f *File) CLose() error
2

1
2
1 这里我们定义了一个File类,并实现有Read()、Write()、Seek()、Close()等方法。设想我们有如下接口:
2

1
2
1type IFile interface {
2

1
2
1Read(buf []byte) (n int, err error)
2

1
2
1Write(buf []byte) (n int, err error)
2

1
2
1Seek(off int64, whence int) (pos int64, err error)
2

1
2
1Close() error
2

1
2
1}
2

1
2
1type IReader interface {
2

1
2
1Read(buf []byte) (n int, err error)
2

1
2
1}
2

1
2
1type IWriter interface {
2

1
2
1Write(buf []byte) (n int, err error)
2

1
2
1}
2

1
2
1type ICloser interface {
2

1
2
1Close() error
2

1
2
1}
2

1
2
1 尽管File类并没有从这些接口继承,甚至可以不知道这些接口的存在,但是File类实现了这些接口,可以进行赋值:
2

1
2
1var file1 IFile = new(File)
2

1
2
1var file2 IReader = new(File)
2

1
2
1var file3 IWriter = new(File)
2

1
2
1var file4 ICloser = new(File)
2

1
2
1 Go语言的非侵入式接口,有以下优点:
2

其一,Go语言的标准库,再也不需要绘制类库的继承树图。

其二,实现类的时候,只需要关心自己应该提供哪些方法,不用再纠结接口需要拆的多细才合理。接口由使用方按需定义,而不用事前规划。

其三,不用为了实现一个接口而导入一个包。

给TA打赏
共{{data.count}}人
人已打赏
安全技术

C++ 中 struct和class 的区别

2022-1-11 12:36:11

安全运维

带你玩转kubernetes-k8s(第18篇:k8s-深入掌握Pod-Node亲和性调度,Taints和Tolerations[污点和容忍])

2021-10-12 11:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索