Examples about Interface in Golang.
About 802 wordsAbout 3 min
Golang
2024-11-13
关于Interface的一些编程例子。
Sort
一个很好的例子是来自标准库的 sort
包,要对一组数字或字符串排序,只需要实现三个方法:反映元素个数的 Len()
方法、比较第 i
和 j
个元素的 Less(i, j)
方法以及交换第 i
和 j
个元素的 Swap(i, j)
方法。
排序函数的算法只会使用到这三个方法(可以使用任何排序算法来实现,此处我们使用冒泡排序)。
func Sort(data Sorter) {
for pass := 1; pass < data.Len(); pass++ {
for i := 0;i < data.Len() - pass; i++ {
if data.Less(i+1, i) {
data.Swap(i, i + 1)
}
}
}
}
Sort
函数接收一个接口类型的参数:Sorter
,它声明了这些方法:
type Sorter interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
现在如果我们想对一个 int
数组进行排序,所有必须做的事情就是:为数组定一个类型并在它上面实现 Sorter
接口的方法:
type IntArray []int
func (p IntArray) Len() int { return len(p) }
func (p IntArray) Less(i, j int) bool { return p[i] < p[j] }
func (p IntArray) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
data := []int{74, 59, 238, -784, 9845, 959, 905, 0, 0, 42, 7586, -5467984, 7586}
a := sort.IntArray(data) //conversion to type IntArray from package sort
sort.Sort(a)
读写
读和写是软件中很普遍的行为,提起它们会立即想到读写文件、缓存(比如字节或字符串切片)、标准输入输出、标准错误以及网络连接、管道等等,或者读写我们的自定义类型。为了让代码尽可能通用,Go 采取了一致的方式来读写数据。
io
包提供了用于读和写的接口 io.Reader
和 io.Writer
:
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
只要类型实现了读写接口,提供 Read()
和 Write
方法,就可以从它读取数据,或向它写入数据。一个对象要是可读的,它必须实现 io.Reader
接口,这个接口只有一个签名是 Read(p []byte) (n int, err error)
的方法,它从调用它的对象上读取数据,并把读到的数据放入参数中的字节切片中,然后返回读取的字节数和一个 error
对象,如果没有错误发生返回 nil
,如果已经到达输入的尾端,会返回 io.EOF("EOF")
,如果读取的过程中发生了错误,就会返回具体的错误信息。类似地,一个对象要是可写的,它必须实现 io.Writer
接口,这个接口也只有一个签名是 Write(p []byte) (n int, err error)
的方法,它将指定字节切片中的数据写入调用它的对象里,然后返回实际写入的字节数和一个 error
对象(如果没有错误发生就是 nil
)。
io
包里的 Readers
和 Writers
都是不带缓冲的,bufio
包里提供了对应的带缓冲的操作,在读写 UTF-8
编码的文本文件时它们尤其有用。在 第12章 我们会看到很多在实战中使用它们的例子。