下面介绍几个常用的接口
1. stringer
在fmt.print中定义了一个Stringer接口. 这个接口里只有一个方法String. 实现了这个接口的String方法的结构体, 那么在外部调用打印结构体的时候, 将按照Stringer中定义的方式打印.
例如给Retriever结构体增加一个String方法.
type Retriever struct { Contents string } func (r *Retriever) String() string { return fmt.Sprintf("Contents:%s", r.Contents) }
使用的时候, 打印对象, 可以看到直接按照String中定义的格式打印
func main() { retriever := &mock.Retriever{"内容"} fmt.Printf("结构体的值是----%s \n", retriever) }
直接打印, 打印结果如下:
结构体的值是----Contents:内容
2. io中的Reader和Write
通过学些这两个接口, 对接口的: 由使用者来定义接口有了进一步的理解.
比如说Reader接口, 定义了一个Read方法
Writer接口定义了一个Write方法
实现了Read方法的结构体有很多, 比如io中的File. 他既实现了Read, 又实现了Write. File这个结构体提供了一些能力, 比如读的能力, 写的能力. 但是, File不会明说我实现了哪些接口. 而只是说定义了哪些方法. File中实现的接口, 有些接口是主动定义的, 有些接口碰上的, 正好他也是这么定义的.
因此, 就是说. 我们定义一个接口, 接口里定义了方法. 而在结构体中, 定义了方法和接口中定义的方法的入参和返回值一致, 我们就认为它实现了这个接口. 虽然我们认为他实现了接口, 但是不是真的实现了接口, 要使用的时候来决定. 如果使用的时候作为接口的实体使用, 那么就表示实体继承了接口. 但是, 如果没有作为接口的实体使用, 那么他就不是实现了接口.
定义方法的时候, 参数尽量使用接口, 这样定义出来的方法, 只要实现了接口的结构体都能用