在看heap的实现接口定义时,发现是这样写的:
type Interface interface {
sort.Interface
Push(x interface{}) // add x as element Len()
Pop() interface{} // remove and return element Len() - 1.
}
对Push、Pop接口实现的举例:
func (h *IntHeap) Pop() interface{} { // 绑定pop方法,从最后拿出一个元素并返回
old := *h
n := len(old)
x := old[n-1]
*h = old[0 : n-1]
return x
}
func (h *IntHeap) Push(x interface{}) { // 绑定push方法,插入新元素
*h = append(*h, x.(int))
}
对实现接口方法的调用
func main() {
h := &IntHeap{2, 1, 5, 6, 4, 3, 7, 9, 8, 0} // 创建slice
heap.Init(h) // 初始化heap
fmt.Println(*h)
fmt.Println(heap.Pop(h)) // 调用pop
heap.Push(h, 6) // 调用push
fmt.Println(*h)
for len(*h) > 0 {
fmt.Printf("%d ", heap.Pop(h))
}
}
输出结果:
[0 1 3 6 2 5 7 9 8 4]
0
[1 2 3 6 4 5 7 9 8 6]
1 2 3 4 5 6 6 7 8 9
对Push、Pop中将interface{}设置为返回类型或接收参数的用法感到奇怪
在StackOverflow上找到了相关解释go - Accept function in argument with empty interface return type - Stack Overflow
其实有点像Java中的返回obejct基类型,因为这是一个空接口,接口中没有定义任何方法,所以任何数据类型都是实现了这种接口,都是属于interface{}类型,如string
or struct{Foo int}
or interface{Explode() bool}
.
需要注意的是,对于Push(x interface{}),我们不能说该方法接收任何类型参数,而应该说该方法接收一个特定的参数类型,即类型interface{}。