Go语言圣经 .6.接口

接口

接口即约定

接口类型

一个接口类型定义了一套方法,如果一个具体类型要实现该接口,那么必须实现接口类型定义中的所有方法。

例如:

package io

type Reader interface {
Read(p []byte) (n int, err error)
}

type Closer interface {
Close() error
}

type ReadWriter interface {
Reader
Writer
}

type ReadWriterCloser interface {
Reader
Writer
Closer
}

实现接口

如果一个类型实现了一个接口要求的所有方法,那么这个类型实现了这个接口。

接口的赋值规则:仅当一个表达式实现了一个接口时,这个表达式才可以赋值给该接口

var w io.Writer
w = os.Stdout // ok: *os.File有Write方法
w = new(bytes.Buffer) // ok: *bytes.Buffer有Write方法
w = time.Second // 编译错误:

空接口类型inferface{},可以将任何值赋给它。

使用flag.Value来解析参数

package main

import (
"fmt"
"time"
"flag"
)

var period = flag.Duration("period", 1*time.Second, "sleep period")

func main() {
flag.Parse()
fmt.Printf("sleeping for %v...", *period)
time.Sleep(*period)
fmt.Println()
}
❯ go run .\sleep.go
sleeping for 1s...
❯ go run .\sleep.go -period 1m5s
sleeping for 1m5s...
❯ go run .\sleep.go -period 20ms
sleeping for 20ms...

接口值

从概念上讲,一个接口类型的值(简称接口值)其实有两个部分:一个具体类型和该类型的一个值。称为接口的动态类型和动态值。

Go语言中,变量总是初始化一个特定的值,接口也不例外。接口的零值就是把它的动态类型和动态值都设置为nil。

使用sort.Interface来排序

http.Handler接口

error接口

示例:表达式求值器

类型断言

类型断言是一种作用在接口值上的操作,写出来类似于x.(T),其中x是一个接口类型的表达式,而T是一个类型(称为断言类型)。类型断言会检查作为操作数的动态类型是否满足指定的断言类型。

类型断言有两种情况,

  • 断言类型T是具体的类型:检查x的动态类型是否就是T
    • 成功:返回x的动态值, 换句话说,具体类型的类型断言从它的操作对象中获得具体的值
    • 失败:panic
  • 断言类型是一个接口类型:检查x的动态类型是否满足T

使用类型断言来识别错误

通过类型断言来查询特性

类型分支

示例:基于标记的XML解析

一些建议