golang interface 作用疑惑

刚接触golang,关于接口有些疑惑。好像用方法可以实现的逻辑,为啥非要用接口呢? 接口反而麻烦,多写几行代码了。比如下面代码

相关代码

package main

import "fmt"

type Humen struct {
    name string
    age  int
}

type Supermen struct {
    Humen
    arms string
}

type ableser interface {
    run()
    fly()
}

func (a Humen) run() {
    fmt.Printf(" %s run ...\n", a.name)
}

func (a Supermen) fly() {
    fmt.Printf(" %s fly ...\n", a.name)
}

func main() {

    a := Supermen{
        Humen: Humen{
            name: "yase",
            age:  20,
        },
        arms: "fly",
    }

    // 接受者可以直接调用run, 岂不更方便
    a.run()

    // interface
    var ifer ableser

    // 疑惑: (接口能做的事情,39行不就可以了吗?) 这里又要初始化interface,感觉唯一的区别是: 保证持有对象都实现了所有方法, run和fly 2个都要实现, 真的是这样吗? 就一个约束吗?
    ifer = a
    ifer.run()
    //ifer.fly()
}

问题是:

接口岂不是多此一举, 方法的接口器直接调用就完了, 干嘛又要用接口再去实现一遍呢? 有何不同吗?

回复
阅读 1.8k
1 个回答

我举个例子来说明下接口的用途吧。

什么是接口,接口的作用是用来通讯的吧,通讯就涉及到客户端和服务端。

现在假设你写了一个开源的包,比如叫:gRPC。我们这里把gRPC内部的服务称为服务端,而把调用gRPC的应用称作客户端。

现在在双方通讯过程中有这么一个需求,当在客户端调用服务端方法的时候,服务端同时也需要执行客户端的特定方法。

这个需求怎么实现?gRPC包必须定义一个接口,这个接口只有一些函数定义,没有具体实现。而实现这个接口需要由客户端来做。

客户端只有全部实现了服务端的接口函数,服务端才能执行客户端的函数。

希望这个例子您能够理解。

推荐问题
宣传栏