第 24 章:Interfaces(接口)

1. 章节简介

  • 接口(interface)定义了一组方法的集合。
  • 在 Go 中,接口的实现是隐式的:只要类型实现了接口的方法,就实现了该接口。
  • 接口常用于 多态、解耦、抽象编程

2. 知识点讲解

(1) 接口定义

type Speaker interface {
    Speak() string
}

(2) 接口隐式实现

  • 不需要关键字 implements,只要方法匹配即可。
type Dog struct{}
func (d Dog) Speak() string { return "Woof!" }

type Cat struct{}
func (c Cat) Speak() string { return "Meow!" }

(3) 接口类型变量

var s Speaker
s = Dog{}
fmt.Println(s.Speak())

(4) 多态

  • 不同类型实现相同接口,表现不同。
animals := []Speaker{Dog{}, Cat{}}
for _, a := range animals {
    fmt.Println(a.Speak()) // 输出 Woof! / Meow!
}

(5) 空接口

  • interface{} 表示可以接受任意类型(类似 Java 的 Object)。
var any interface{}
any = 42
any = "hello"

(6) 类型断言(type assertion)

val, ok := any.(string)
if ok {
    fmt.Println("It's a string:", val)
}

3. 代码示例

package main

import "fmt"

type Speaker interface {
    Speak() string
}

type Dog struct{}
func (Dog) Speak() string { return "Woof!" }

type Cat struct{}
func (Cat) Speak() string { return "Meow!" }

func main() {
    // 接口多态
    animals := []Speaker{Dog{}, Cat{}}
    for _, a := range animals {
        fmt.Println(a.Speak())
    }

    // 空接口 + 类型断言
    var x interface{} = "Hello"
    if str, ok := x.(string); ok {
        fmt.Println("x is string:", str)
    }
}

4. 练习任务

  1. 定义一个 Shape 接口,包含 Area() 方法。
  2. CircleRectangle 实现 Area()
  3. 使用接口变量计算不同图形的面积。
  4. 尝试用空接口存储不同类型数据,并用类型断言取出。

5. 小结

  • 接口是方法集合,Go 中实现是隐式的。
  • 使用接口可以实现多态。
  • 空接口可表示任意类型。
  • 类型断言用于获取具体类型。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容