首页 > go中怎样形象的理解接口?

go中怎样形象的理解接口?

结构体可以用类来理解,方法可以用类内定义的函数来理解,有点搞不懂接口到底用来干嘛


如果说类是对数据和方法的抽象和封装,那么接口就是对类的抽象。

这里使用Java来说明,Java中的接口与`Go`中的接口是类似的,只不过Java中要显式的声明实现某个接口,而Go中不需要显式的声明实现了某个接口,只要实现了其中的所有方法,就默认为实现了该接口。

比如说有一个Person接口:

public interface Person{
    void walk();
}

有一个Student类实现了Person接口

public class Student implements Person {
    //实现walk方法
    @Override
    public void walk(){
        System.out.print("Student.walk()");
    }
    //...其他方法
}

有一个Teacher类也实现了Person接口

public class Teacher implements Person {
    //实现walk方法
    @Override
    public void walk(){
        System.out.print("Teacher.walk()");
    }
    //...其他方法
}

在某个类中可以这样使用

public class SomeClass{
    //这里接收一个Person类型
    public static void usePerson(Person p){
        p.walk()
    }
    
    public static void main(String[] args){
        //可以接收任何实现了Person接口的类的对象
        usePerson(new Student());
        usePerson(new Teacher());
    }
}

使用接口的好处是非常灵活,这样就与具体的实现做了解耦,如果以后有其他的实现类,只需要实现Person接口就可以了,而不用去改使用的时候的代码。


接口没什么高深之处,其作用就是对外隐藏实现:

type A interface {
    Get(k string) interface{}
    Set(k string, v interface{})
}

func NewA() A {
    return &a{}
}

type a struct {
    // ...
}

func (a0 *a) Get(k string) interface{} {
    // ...
    return nil
}

func (a0 *a) Set(k string, v interface{}) {
    // ...
}

Golang 中没有 class 的概念,而是通过 interface 类型转换支持在动态类型语言中常见的鸭子类型从而达到运行时多态的效果。

简而言之,interface就是一组method的集合。 只要一个类型A实现了接口I中的method,那么在之后的使用时,这个接口I类型的变量便可以接受类型A的变量。这样在之后的使用中,同一个接口,可以接收不同类型的变量。

【热门文章】
【热门文章】