视角:本文从类型与面向对象概念讲接口定义和实现;interface 的运行时表示及反射关联见接口与反射笔记。 Go 里的接口(interface)和类型(type)是两个基本概念:类型描述数据长什么样,接口描述对象能做什么。
1. Go 中的类型(Type)
定义
类型(type)是 Go 语言中的基本构建块,它定义了变量、常量、结构体、数组等数据的形式。类型在 Go 中是用来声明变量和创建结构的。
示例:基本类型定义
go
type Age int
type Name string
var myAge Age
var myName Name使用
类型用于创建变量和结构体字段、定义函数参数和返回值,以及实现方法。可以通过类型定义新的数据类型,使代码更加自文档化和结构化。
示例:结构体类型
go
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "Alice", Age: 30}
fmt.Println(p.Name, p.Age)
}2. Go 中的接口(Interface)
定义
接口(interface)是一种抽象类型,它定义了一组方法的集合。任何类型只要实现了接口中定义的所有方法,就被认为实现了这个接口。接口的目的是让不同类型的对象被同一段代码处理。
示例:接口定义
go
type Speaker interface {
Speak() string
}使用
接口用于定义方法集合,使得不同的类型可以通过实现相同的接口来实现多态。接口方法的实现并不需要与接口的定义在同一个类型中,允许不同的类型在不修改接口的情况下实现接口。
示例:接口实现
go
type Speaker interface {
Speak() string
}
type Person struct {
Name string
}
func (p Person) Speak() string {
return "Hi, I'm " + p.Name
}
func greet(s Speaker) {
fmt.Println(s.Speak())
}
func main() {
p := Person{Name: "Alice"}
greet(p) // 输出: Hi, I'm Alice
}3. 区别和关系
类型与接口的区别
定义和目的:
- 类型:用于定义数据的具体形式和结构,例如结构体、数组、切片等。它们描述了数据的存储结构和操作。
- 接口:定义了一组方法的集合,而不关心这些方法的具体实现。接口提供了一种抽象机制,使得不同的类型可以通过实现相同的方法来互换。
实现方式:
- 类型:定义了数据的存储和操作方式。不同的类型有不同的字段和方法。
- 接口:只定义方法的签名,不提供实现。任何类型只要实现了接口中的所有方法,就实现了这个接口。
用途:
- 类型:组织数据并实现对数据的操作。
- 接口:描述行为规范,让不同类型按同一套方法签名被统一处理。
类型和接口的关系
- 类型实现接口:一个类型可以实现一个或多个接口。接口方法的实现是由具体的类型提供的。
- 接口类型:接口本身也是一种类型,但它不存储具体的数据。它用于描述对象的行为。
- 多态:接口允许不同类型的对象使用相同的接口进行操作,实现了多态性。
4. 示例:类型与接口的结合使用
示例:类型实现接口
go
package main
import "fmt"
// 定义接口
type Formatter interface {
Format() string
}
// 定义类型
type Person struct {
Name string
}
// 实现接口方法
func (p Person) Format() string {
return "Name: " + p.Name
}
func printFormatted(f Formatter) {
fmt.Println(f.Format())
}
func main() {
p := Person{Name: "Bob"}
printFormatted(p) // 输出: Name: Bob
}总结
- 类型(Type):定义数据的存储形式和操作方式。
- 接口(Interface):定义一组方法签名,描述行为规范。
类型实现了接口的全部方法,就能赋给接口变量;函数参数写成接口,就能接受任何实现了这些方法的类型,这是 Go 实现多态的方式。