V
Vel·ToolKit
简洁 · 高效 · 即开即用
ZH
第 12 章 / 共 20 章

接口

隐式实现、空接口、类型断言

接口定义与隐式实现

Go 的接口由方法集定义,类型只要拥有方法集中所有方法就自动实现该接口,无需 implements 关键字。

package main

import "fmt"

type Stringer interface {
    String() string
}

type User struct{ Name string }

func (u User) String() string { return "User(" + u.Name + ")" }

func main() {
    var s Stringer = User{"Alice"}
    fmt.Println(s.String())
}

空接口与 any

interface{} 没有任何方法,所有类型都满足。Go 1.18 起内置 any 作为它的别名。

package main

import "fmt"

func Print(v any) { fmt.Println(v) }

func main() {
    Print(1)
    Print("hi")
    Print([]int{1, 2})
}

类型断言与 type switch

package main

import "fmt"

func describe(v any) {
    switch x := v.(type) {
    case int:
        fmt.Println("int", x)
    case string:
        fmt.Println("string", x)
    default:
        fmt.Printf("%T %v\n", x, x)
    }
}

func main() {
    describe(42)
    describe("hi")
    describe(3.14)
}

接口设计建议

  • 接口越小越好:标准库的 io.Reader、io.Writer 都只有一个方法
  • 接口由使用方定义,而不是实现方主动“声明实现”
  • 返回具体类型,接受接口(accept interfaces, return structs)