第 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)