Go——函数返回类型或接收参数为空接口interface{}的意义

在看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{}。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值