Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:go:接口

接口 Interface


简单介绍(摘自菜鸟教程)

接口的特点

隐式实现:

  • Go 中没有关键字显式声明某个类型实现了某个接口。
  • 只要一个类型实现了接口要求的所有方法,该类型就自动被认为实现了该接口。

接口类型变量:

  • 接口变量可以存储实现该接口的任意值。
  • 接口变量实际上包含了两个部分:
    • 动态类型:存储实际的值类型。
    • 动态值:存储具体的值。

零值接口:

  • 接口的零值是 nil。
  • 一个未初始化的接口变量其值为 nil,且不包含任何动态类型或值。

空接口:

  • 定义为 interface{},可以表示任何类型。

接口的常见用法

  1. 多态:不同类型实现同一接口,实现多态行为。
  2. 解耦:通过接口定义依赖关系,降低模块之间的耦合。
  3. 泛化:使用空接口 interface{} 表示任意类型。

演示

package main
 
import (
	"fmt"
	"math"
)
 
// 「Go 的接口设计简单却功能强大,是实现多态和解耦的重要工具」
 
// 接口:定义操作
type Shape interface {
	Area() float64
}
 
// 结构体:定义数据
type Circle struct {
	Radius float64
}
 
// 在Circle上定义Area操作
// 在Circle定义了所有的Shape的函数后,就相当于Circle实现了接口Shape
// 这种函数叫作「方法」
// c叫作方法的接收器(receiver)
func (c Circle) Area() float64 {
	return math.Pi * c.Radius * c.Radius
}
 
func printStr(t interface{}) {
	// 类型断言:确定t是string类型,获取其string形式的原始值
	if v, success := t.(string); success {
		fmt.Println("String:", v)
	} else {
		fmt.Print("Not a string")
 
		// 类型选择(这里有点没看懂)
		switch value := t.(type) {
		case int:
			fmt.Print(" (Int: ", value, ")")
		}
		fmt.Println()
	}
 
}
 
// 读取接口
type Reader interface {
	Read() string
}
 
// 写入接口
type Writer interface {
	Write(content string)
}
 
// 将两个接口组合起来
type ReadWriter interface {
	// 这里不是定义函数了,而是引入其他的接口
	Reader
	Writer
}
 
func main() {
	// 定义数据
	c := Circle{Radius: 5}
	// 接口变量可以存储实现了接口的类型
	var s Shape = c
	fmt.Println("Area: ", s.Area())
 
	// 空接口 interface{} 是 Go 的特殊接口,表示所有类型的超集
	// 所有类型都实现了 interface{},所以它可以存储任何类型
	var t interface{} = "content"
	printStr(t)
	printStr(1)
 
}
/var/www/DokuWikiStick/dokuwiki/data/pages/程序/go/接口.txt · Last modified: 2025/04/27 07:17 by zhonghui