📜  GO语言 接口(1)

📅  最后修改于: 2023-12-03 15:01:03.504000             🧑  作者: Mango

GO语言 接口

在Go语言中,接口是一组方法签名的集合。当一个类型定义了接口中的所有方法时,它被称为实现了该接口。接口提供了一种将不同的类型进行快速和非侵入式的聚合的方式。

声明和使用接口

通过关键字interface来定义一个接口:

type MyInterface interface {
    Method1(param1 Type1) ReturnType1
    Method2(param2 Type2) ReturnType2
}

这里定义了一个名为MyInterface的接口,它有两个方法:Method1和Method2,它们的参数列表和返回值列表分别是(param1 Type1) ReturnType1和(param2 Type2) ReturnType2。

一个类型如果实现了MyInterface中的所有方法,那么它就是MyInterface类型的实现类。下面是一个实现MyInterface接口的例子:

type MyType int

func (m MyType) Method1(param1 Type1) ReturnType1 {
    // implementation for Method1
}

func (m MyType) Method2(param2 Type2) ReturnType2 {
    // implementation for Method2
}

这里定义了一个名为MyType的类型,它实现了MyInterface中的Method1和Method2方法。

接口变量

在Go中,接口变量由一个动态类型(dynamic type)和一个动态值(dynamic value)组成。动态类型是指接口变量内部存储的值的类型,动态值是指存储的实际值。

var i MyInterface = MyType(10)

这里创建了一个MyInterface类型的接口变量i,并将一个MyType类型的值赋给它。运行时,i的动态类型是MyType,动态值是一个MyType类型的值。

类型断言

类型断言是指将接口变量的动态值转换为一个具体的类型值。

v, ok := i.(MyType)

这里使用了类型断言操作符.,将i的动态值转换为MyType类型。如果i的动态类型是MyType,那么v就是i的动态值对应的MyType类型的值;否则,v将是一个零值,而ok将会是false。

接口的嵌套和组合

和结构体类似,接口也支持嵌套和组合。通过接口的嵌套和组合,我们可以将多个接口进行组合,从而组成一个更大的接口。

type MySubInterface interface {
    Method3(param3 Type3) ReturnType3
}

type MyInterfaceWithSubInterface interface {
    MyInterface
    MySubInterface
}

这里定义了一个名为MySubInterface的接口,它有一个方法Method3。另外定义了一个名为MyInterfaceWithSubInterface的接口,它通过嵌套MyInterface和MySubInterface,从而组合成一个更大的接口。

总结

在Go语言中,接口是一种非常有用的机制,它将对类型的限制全部转化到类型的接口上,为代码生成和重用提供了非常方便的方式。同时,接口还可以用来实现多态和依赖注入等功能。