当前位置:   article > 正文

Golang 接口(interface)_golang 类转interface

golang 类转interface

原创比较累,希望大家能点点赞,对我的支持。你们的支持,就是我的动力。

1. 接口实现

在 Go 中,接口是一种抽象类型,它定义了一组方法签名,但没有实现。接口用于描述对象应该具有的方法集合,而不是具体的实现方式。

接口的定义使用 `type` 和 `interface` 关键字。例如:


type MyInterface interface {
    Method1() int
    Method2(string) string
}
 

上面的代码定义了一个名为 `MyInterface` 的接口,它包含两个方法 `Method1` 和 `Method2`,一个返回 `int` 类型,另一个返回 `string` 类型。

接口的实现是通过创建实现了接口中所有方法的具体类型来完成的。在 Go 中,一个类型只要实现了接口中定义的所有方法,就被认为是实现该接口的类型。例如:


type MyStruct struct {
    // ...
}

func (s MyStruct) Method1() int {
    // ...
}

func (s MyStruct) Method2(str string) string {
    // ...
}

var myVar MyInterface = MyStruct{}
 

上面的代码定义了一个名为 `MyStruct` 的结构体,并实现了 `MyInterface` 接口中定义的 `Method1` 和 `Method2` 方法。然后,我们创建了一个类型为 `MyInterface` 的变量 `myVar`,并将它设置为 `MyStruct` 的实例。由于 `MyStruct` 实现了 `MyInterface` 中定义的所有方法,因此它被认为是实现了 `MyInterface` 接口的类型,可以被赋值给 `MyInterface` 类型的变量。

需要注意的是,Go 中的接口是隐式实现的,也就是说,类型不需要显式声明它实现了哪个接口只要实现了接口中定义的所有方法即可。这种灵活性使得 Go 中的接口非常强大和易于使用。

下面是一个用Go 接口实现的工厂模式代码:

  1. package main
  2. import "fmt"
  3. type Product interface {
  4.     GetName() string
  5. }
  6. type ProductA struct {}
  7. func (p *ProductA) GetName() string {
  8.     return "ProductA"
  9. }
  10. type ProductB struct {}
  11. func (p *ProductB) GetName() string {
  12.     return "ProductB"
  13. }
  14. type Factory interface {
  15.     CreateProduct() Product
  16. }
  17. type FactoryA struct {}
  18. func (f *FactoryA) CreateProduct() Product {
  19.     return &ProductA{}
  20. }
  21. type FactoryB struct {}
  22. func (f *FactoryB) CreateProduct() Product {
  23.     return &ProductB{}
  24. }
  25. func main() {
  26.     factoryA := new(FactoryA)
  27.     productA := factoryA.CreateProduct()
  28.     fmt.Println(productA.GetName())
  29.     factoryB := new(FactoryB)
  30.     productB := factoryB.CreateProduct()
  31.     fmt.Println(productB.GetName())
  32. }

在这个示例代码中,我们定义了一个Product接口,它包含一个GetName方法。然后我们定义了两个实现了Product接口的结构体:ProductA和ProductB。接下来,我们定义了一个Factory接口,它包含一个CreateProduct方法返回一个Product实例。我们实现了两个工厂结构体:FactoryA和FactoryB,它们实现了Factory接口并分别返回一个ProductA和ProductB实例。最后在main函数中,我们可以通过调用不同的工厂实例的CreateProduct方法来创建不同的Product实例,并通过GetName方法获取各自的名称。 

2. interface 是一种特殊的类型,它可以表示任何类型的值

在 Golang 中,interface 是一种特殊的类型,它可以表示任何类型的值。使用 interface,我们可以在一个函数或方法中处理各种类型的值,而不需要知道值的具体类型。

要将 interface 类型转换为其具体类型的对象,我们可以使用类型断言 (type assertion)。类型断言的语法如下:


value, ok = expression.(T)
 

其中,`expression` 是一个接口类型的值。`T` 是要将其转换为的具体类型。如果转换成功,那么 `value` 是转换后的值,`ok` 是 true。如果转换失败,那么 `value` 是类型 `T` 的零值,`ok` 是 false。

下面是一个用于将 interface 类型转换为其具体类型的示例代码:

  1. package main
  2. import "fmt"
  3. type Animal interface {
  4.     Sound() string
  5. }
  6. type Dog struct{}
  7. func (d Dog) Sound() string {
  8.     return "Woof!"
  9. }
  10. type Cat struct{}
  11. func (c Cat) Sound() string {
  12.     return "Meow!"
  13. }
  14. func main() {
  15.     var animal Animal
  16.     // create a dog object and assign it to the interface variable
  17.     animal = Dog{}
  18.     dog, ok := animal.(Dog)
  19.     if ok {
  20.         fmt.Println(dog.Sound()) // output: Woof!
  21.     }
  22.     // create a cat object and assign it to the interface variable
  23.     animal = Cat{}
  24.     cat, ok := animal.(Cat)
  25.     if ok {
  26.         fmt.Println(cat.Sound()) // output: Meow!
  27.     }
  28. }


 

在上面的代码中,我们定义了 `Animal` 接口,并为其定义了两种实现:`Dog` 和 `Cat`。在 `main()` 函数中,我们创建了一个名为 `animal` 的 `Animal` 类型的变量,并先后将 `Dog` 和 `Cat` 对象分配给它。然后我们使用类型断言将值转换为 `Dog` 和 `Cat` 类型的变量。 通过此方法,我们可以从接口变量中提取出具体类型并对其进行操作。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/907792
推荐阅读
相关标签
  

闽ICP备14008679号