【问题标题】:what's the difference between interface pointer and interface value in golanggolang中接口指针和接口值有什么区别
【发布时间】:2020-06-02 07:12:07
【问题描述】:
Node 是结构体类型时,不能编译。
但是当Node 是接口类型时没关系。
为什么?
type Node interface {
}
// test1's parameter are pointer
func test1(b *Node) {
test2(b)
}
// test2's parameter are not pointer
func test2(c Node) {}
【问题讨论】:
标签:
go
interface
type-conversion
【解决方案1】:
回答标题中的问题:接口指针是指向接口值的指针。但是,接口指针并没有那么有用,因为接口已经是引用类型了。
至于为什么当Node 是一个结构时您的代码无法编译,您正试图将一个指针传递给一个带值的函数。你应该这样做:
func test1(b *Node) {
test2(*b)
}
但是当Node 是空接口时,test2() 的参数是interface{} 类型,也称为空接口。任何类型(包括b,它是一个指针)都将被隐式转换为一个空接口。因此,将任何内容传递给test2(),当其参数类型为interface{} 时,将编译。
【解决方案2】:
让我们看看Node声明的一些变化:
示例 1:
type Node interface {
}
代码编译是因为所有类型都满足空接口。
示例 2:
type Node interface {
AnyMethod()
}
编译器报如下错误:
不能在 test2 的参数中使用 b (type *Node) 作为类型 Node:*Node 是指向接口的指针,而不是接口
编译失败,因为*Node 没有方法AnyMethod。
示例 3:
type Node struct {
}
编译器报如下错误:
不能在 test2 的参数中使用 b(类型 *Node)作为类型节点
编译失败,因为*Node 和Node 是不同的类型。
编译错误的一个修复方法是取消引用指针:
func test1(b *Node) {
test2(*b)
}