初步解读Golang中的接口相关编写方法

2020-01-28 12:02:25王振洲

        var r2 io.Reader = rw2    //ok


因为r没有Write方法,所以不能赋值给rw。

接口嵌套
我们来看看io package中的另外一个接口:


// ReadWriter is the interface that groups the basic Read and Write methods.
type ReadWriter interface {
 Reader
 Writer
}


该接口嵌套了io.Reader和io.Writer两个接口,实际上,它等同于下面的写法:


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


注意,Go语言中的接口不能递归嵌套,


// illegal: Bad cannot embed itself
type Bad interface {
 Bad
}

// illegal: Bad1 cannot embed itself using Bad2
type Bad1 interface {
 Bad2
}
type Bad2 interface {
 Bad1
}


空接口(empty interface)
空接口比较特殊,它不包含任何方法:

interface{}
在Go语言中,所有其它数据类型都实现了空接口。


var v1 interface{} = 1
var v2 interface{} = "abc"
var v3 interface{} = struct{ X int }{1}


如果函数打算接收任何数据类型,则可以将参考声明为interface{}。最典型的例子就是标准库fmt包中的Print和Fprint系列的函数:


func Fprint(w io.Writer, a ...interface{}) (n int, err error)
func Fprintf(w io.Writer, format string, a ...interface{})
func Fprintln(w io.Writer, a ...interface{})
func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{})
func Println(a ...interface{}) (n int, err error)


注意,[]T不能直接赋值给[]interface{}


        t := []int{1, 2, 3, 4}
        var s []interface{} = t


编译时会输出下面的错误:

cannot use t (type []int) as type []interface {} in assignment

我们必须通过下面这种方式:


t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
    s[i] = v
}