interface

数据结构 #

// 结构体表示包含方法的接口
type iface struct {
	tab  *itab
	data unsafe.Pointer
}
// 结构体表示不包含任何方法的 interface{} 类型
type eface struct {
	_type *_type
	data  unsafe.Pointer
}

Golang中的Interface可以被看作是一个Wrapper,它是一个包含了value和type的二元组

// 必须类型和值都为nil才算真正的nil

var a interface{} = nil         // tab = nil, data = nil
var b interface{} = (*int)(nil) // tab 包含 *int 类型信息, data = nil
fmt.Println(a == nil)           // true
fmt.Println(b == nil)           // false

判断动态值为nil #

func IsNil(i interface{}) bool {
    vi := reflect.ValueOf(i)
    if vi.Kind() == reflect.Ptr {
        return vi.IsNil()
    }
    return false
}

用处 #

// 编译器会由此检查 *myWriter 类型是否实现了 io.Writer 接口
var _ io.Writer = (*myWriter)(nil)