【Go】Go 语言教程--Go 语言接口(十九)

梦里梦外; 2023-10-13 20:54 166阅读 0赞

往期回顾:

  • Go 语言教程–介绍(一)
  • Go 语言教程–语言结构(二)
  • Go 语言教程–语言结构(三)
  • Go 语言教程–数据类型(四)
  • Go 语言教程–语言变量(五)
  • Go 语言教程–GO语言常量(六)
  • Go 语言教程–GO语言运算符(七)
  • Go 语言教程–GO条件和循环语句(八)
  • Go 语言教程–GO语言函数(九)
  • Go 语言教程–GO语言变量作用域(十)
  • Go 语言教程–GO语言数组(十一)
  • Go 语言教程–GO语言指针(十二)
  • Go 语言教程–GO语言结构体(十三)
  • Go 语言教程–GO语言切片(Slice)(十四)
  • Go 语言教程–Go 语言范围(Range)(十五)
  • Go 语言教程–Go 语言Map(集合)(十六)
  • Go 语言教程–Go 语言递归函数(十七)
  • Go 语言教程–Go 语言类型转换(十八)

文章目录

Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。

接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。

Go 语言中的接口是隐式实现的,也就是说,如果一个类型实现了一个接口定义的所有方法,那么它就自动地实现了该接口。因此,我们可以通过将接口作为参数来实现对不同类型的调用,从而实现多态。

实例

  1. /* 定义接口 */
  2. type interface_name interface {
  3. method_name1 [return_type]
  4. method_name2 [return_type]
  5. method_name3 [return_type]
  6. ...
  7. method_namen [return_type]
  8. }
  9. /* 定义结构体 */
  10. type struct_name struct {
  11. /* variables */
  12. }
  13. /* 实现接口方法 */
  14. func (struct_name_variable struct_name) method_name1() [return_type] {
  15. /* 方法实现 */
  16. }
  17. ...
  18. func (struct_name_variable struct_name) method_namen() [return_type] {
  19. /* 方法实现*/
  20. }

实例
以下两个实例演示了接口的使用:

实例 1

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Phone interface {
  6. call()
  7. }
  8. type NokiaPhone struct {
  9. }
  10. func (nokiaPhone NokiaPhone) call() {
  11. fmt.Println("I am Nokia, I can call you!")
  12. }
  13. type IPhone struct {
  14. }
  15. func (iPhone IPhone) call() {
  16. fmt.Println("I am iPhone, I can call you!")
  17. }
  18. func main() {
  19. var phone Phone
  20. phone = new(NokiaPhone)
  21. phone.call()
  22. phone = new(IPhone)
  23. phone.call()
  24. }

在上面的例子中,我们定义了一个接口 Phone,接口里面有一个方法 call()。然后我们在 main 函数里面定义了一个 Phone 类型变量,并分别为之赋值为 NokiaPhone 和 IPhone。然后调用 call() 方法,输出结果如下:

  1. I am Nokia, I can call you!
  2. I am iPhone, I can call you!

第二个接口实例:

实例

  1. package main
  2. import "fmt"
  3. type Shape interface {
  4. area() float64
  5. }
  6. type Rectangle struct {
  7. width float64
  8. height float64
  9. }
  10. func (r Rectangle) area() float64 {
  11. return r.width * r.height
  12. }
  13. type Circle struct {
  14. radius float64
  15. }
  16. func (c Circle) area() float64 {
  17. return 3.14 * c.radius * c.radius
  18. }
  19. func main() {
  20. var s Shape
  21. s = Rectangle{
  22. width: 10, height: 5}
  23. fmt.Printf("矩形面积: %f\n", s.area())
  24. s = Circle{
  25. radius: 3}
  26. fmt.Printf("圆形面积: %f\n", s.area())
  27. }

以上实例中,我们定义了一个 Shape 接口,它定义了一个方法 area(),该方法返回一个 float64 类型的面积值。然后,我们定义了两个结构体 Rectangle 和 Circle,它们分别实现了 Shape 接口的 area() 方法。在 main() 函数中,我们首先定义了一个 Shape 类型的变量 s,然后分别将 Rectangle 和 Circle 类型的实例赋值给它,并通过 area() 方法计算它们的面积并打印出来,输出结果如下:

  1. 矩形面积: 50.000000
  2. 圆形面积: 28.260000

需要注意的是,接口类型变量可以存储任何实现了该接口的类型的值。在示例中,我们将 Rectangle 和 Circle 类型的实例都赋值给了 Shape 类型的变量 s,并通过 area() 方法调用它们的面积计算方法。

发表评论

表情:
评论列表 (有 0 条评论,166人围观)

还没有评论,来说两句吧...

相关阅读