Skip to content

视角:本文从类型与面向对象概念讲接口定义和实现;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. 区别和关系 ​

类型与接口的区别 ​

  1. 定义和目的:

    • 类型:用于定义数据的具体形式和结构,例如结构体、数组、切片等。它们描述了数据的存储结构和操作。
    • 接口:定义了一组方法的集合,而不关心这些方法的具体实现。接口提供了一种抽象机制,使得不同的类型可以通过实现相同的方法来互换。
  2. 实现方式:

    • 类型:定义了数据的存储和操作方式。不同的类型有不同的字段和方法。
    • 接口:只定义方法的签名,不提供实现。任何类型只要实现了接口中的所有方法,就实现了这个接口。
  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 实现多态的方式。

参考资料 ​

相关页面 ​

Hello Golang