Interface

  • 接口是一个或多个方法签名的集合,任何类型的方法集中只要拥有与之对应的全部方法,就表示它“实现”了该接口。

  • 接口只有方法签名,没有实现。

  • 接口没有数据字段。

  • 可在接口中嵌入其他接口。

  • 类型可实现多个接口。

  • 任何类型都实现了空接口。

  • 匿名接口可以用作变量类型,或结构体成员。

    type Tester struct {
        s interface {
            String() string
        }
    }
    
    type User struct {
        id   int
        name string
    }
    
    func (u *User) String() string {
        return fmt.Sprintf("User %d, %s", u.id, u.name)
    }
    
    func main() {
        tt := Tester{&User{1, "Tom"}}
        fmt.Println(tt.s.String())
    }

类型断言

利用类型断言,可以判断接口是否为某个具体的接口。

type User struct {
    id   int
    name string
}

func (u *User) String() string {
    return fmt.Sprintf("%d, %s", u.id, u.name)
}

func main() {
    var o interface{} = &User{1, "Tom"}
    if i, ok := o.(fmt.Stringer); ok {
        fmt.Println(i)
    }
}

类型分支

可以使用switch做批量判断,不支持fallthrough

var o interface{} = &User{1, "Tom"}
switch v := o.(type) {
case nil:
    fmt.Println("nil")
case fmt.Stringer:
    fmt.Println(v)
case func() string:
    fmt.Println(v())
default:
    fmt.Println("unknown")
}

Last updated

Was this helpful?