结构体可以用类来理解,方法可以用类内定义的函数来理解,有点搞不懂接口到底用来干嘛
如果说类是对数据和方法的抽象和封装,那么接口就是对类的抽象。
这里使用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的变量。这样在之后的使用中,同一个接口,可以接收不同类型的变量。