在golang 的 interface(第一篇) - 接口的定义与实现里面,我稍微讲了一下我理解的什么是接口,怎么定义接口,怎么实现接口,本文将会讲一讲接口的作用。

接口作为参数代表什么

如果一个函数的参数类型是一个接口,代表:在使用这个函数的时候,可以传进来一个实现了这个接口的类型。

比如一个接口的参数类型是「跑」(runType),不管他是跑到哪里,跑多久,是要一个对象可以跑,那这个对象就可以使用这个函数。

接口作为参数可以做什么

将对象一般行为抽象出来,作为接口,例如:

io.Writer
type Writer interface {
	Write(p []byte) (n int, err error)
}

代表了所有可以写入字节的抽象,比如:文件,缓冲,http,hasher。

io.Writer

我觉得自己对这个还不理解,感觉自己说了很多废话。

Print

所以,屏幕可以定义自己的展现字符的方式,日志可以定义自己存储日志的格式,http server 可以定义网络返回的数据的格式,等等等等,只要这个独特的对象定义了自己的写方法,那么他就可以药药药切克闹。。

sort 包示例说明

Interface
type Interface interface {
	Len() int
	Less(i, j int) bool
	Swap(i, j int)
}
Interface

然后还定义了一个函数,接受作为参数,并将其排序

func Sort(data Interface)

所以,对于任何数据类型,你定义的乱七八糟的东西。你想要对他排序?

Interface

字符串数组 sort 示例

type personName []string

func (pn personName) Len() int {
	return len(pn)
}

func (pn personName) Less(i, j int) bool {
	return pn[i] < pn[j]
}

func (pn personName) Swap(i, j int) {
	pn[i], pn[j] = pn[j], pn[i]
}
personNamesortInterfacesort.Sort
func main() {
	pn :=personName{"chen","zhao","qian","sun","li"}
	sort.Sort(pn)

	fmt.Println(pn)
}

自定义 struct sort 示例

type Person struct {
	Name string
	Age  int
}

type Human []Person

func (h Human) Len() int {
	return len(h)
}

func (h Human) Less(i, j int) bool {
	p1 := h[i]
	p2 := h[j]
	if p1.Age < p2.Age {
		return true
	} else if p1.Age == p2.Age {
		return p1.Name <= p2.Name
	}
	return false
}

func (h Human) Swap(i, j int) {
	h[i], h[j] = h[j], h[i]
}

嗯,上面定义了一个人类的对象,然后他们排序的时候先比较年龄,再比较名字。

func main() {
	h := Human{
		Person{Name: "chen", Age: 24},
		Person{Name: "zhao", Age: 24},
		Person{Name: "qian", Age: 26},
	}
	sort.Sort(h)

	fmt.Println(h)
}
[{chen 24} {zhao 24} {qian 26}]

怎么实现逆向排序

sort 逆向排序

这个函数支持输入一并返回一个``接口,但是返回的那个的接口的方法被修改了

func Reverse(data Interface) Interface {
	return &reverse{data}
}
type reverse struct {
	Interface
}
reverseInterfaceInterface
Interfacereverse

更为神奇的是:他在你实现了这些接口之后,改变了你所定义的意义。

看一看 sort 里的实现:

func (r reverse) Less(i, j int) bool {
	return r.Interface.Less(j, i)
}

哈哈哈😁,Less 反过来了

使用:

func main() {
	h := Human{
		Person{Name: "chen", Age: 24},
		Person{Name: "zhao", Age: 24},
		Person{Name: "qian", Age: 26},
	}
	//sort.Sort(h)
	sort.Sort(sort.Reverse(h))
	fmt.Println(h)
}