golang特性
interface
应用场景
面向接口编程
抽象类型的实现:接口提供了一种抽象的方式来定义类型的行为。通过接口,可以定义一组方法的集合,然后任何类型只要实现了这组方法,就可以被视为是这个接口的实现类型。这样就可以针对接口编程,而不是具体的实现类型,从而实现了代码的抽象化和解耦合。
多态:接口使得在编写代码时可以编写更通用、更灵活的代码。通过接口,可以将具体的实现细节与调用方解耦合,从而实现了多态。这样,可以根据具体的情况动态地替换具体的实现类型,而不需要修改调用方的代码。
适配器模式:接口可以用于实现适配器模式。适配器模式用于将一个类的接口转换为另一个类的接口,从而使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。在 Go 中,接口可以用于定义适配器接口,然后通过实现这个接口的具体类型来适配不同的接口。
依赖注入:接口可以用于实现依赖注入。依赖注入是一种设计模式,用于减少代码的耦合度,提高代码的可测试性和可维护性。通过接口,可以将一个类型的依赖关系注入到另一个类型中,从而使得代码更加灵活和可测试。
框架和库设计:在设计框架和库时,接口是一个非常重要的概念。通过接口,可以定义框架或库提供的服务接口,然后由具体的实现类型来实现这些接口。这样,在使用框架或库时,用户可以通过接口来调用服务,而不需要关心具体的实现细节,从而提高了代码的可维护性和可扩展性。
interface 隐式实现
- golang 对象实现interface 无需任何关键词,只需要该对象的方法集中包含接口定义的所有方法且方法签名一致
- 对象实现接口可以借助struct内嵌的特性,实现接口的默认实现
- 类型T方法集包含全部receiver T 方法;类型*T方法集包含 receiver T + *T 方法
- 类型T实例 value或pointer可以调用全部的方法,编译器会自动转换
- 类型T实现接口,不管是T还是*T都实现了该接口
- 类型*T实现接口,只有T类型的指针实现了该接口
package mainimport "fmt"// 定义一个接口
type Printer interface {Print()
}// 定义一个结构体类型
type MyStruct struct {Message string
}// 为结构体类型实现接口的方法
func (m MyStruct) Print() {fmt.Println(m.Message)
}func main() {// 创建结构体实例myStruct := MyStruct{Message: "Hello, world!"}// 将结构体实例传递给接口类型的参数var printer Printer = myStruct// 调用接口方法,实际上是调用了结构体类型的方法printer.Print() // 输出:Hello, world!
}
MyStruct 类型实现了 Printer 接口的 Print 方法,但在代码中并没有显式地声明 MyStruct 实现了 Printer 接口。因此,MyStruct 类型被视为隐式实现了 Printer 接口。