【问题标题】: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{} 时,将编译

    【讨论】:

    • 我发现 Method_sets 。有没有类似java的向上转换的东西?例如将*Node 转换为Node?
    • 是的。 (如果你接受我的回答,我会告诉你:)
    【解决方案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)作为类型节点

    编译失败,因为*NodeNode 是不同的类型。

    编译错误的一个修复方法是取消引用指针:

    func test1(b *Node) {
        test2(*b)
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2014-06-20
      • 1970-01-01
      • 2018-01-06
      相关资源
      最近更新 更多