为什么Go允许指向接口?

时间:2016-04-04 23:14:21

标签: pointers reflection go interface

在我编写Go代码的过程中,我从未遇到过一个案例,也没有想到一个需要使用指向接口的指针,除了编写一个大量使用运行时反射的库。 Some people提到有充分理由这样做,但似乎从未进一步阐述。这个功能似乎也对开始使用Go的开发人员造成了相当大的困惑。

main.go:22: cannot use &a (type *A) as type **interface {} in argument to run

使用接口指针的好例子是什么?

2 个答案:

答案 0 :(得分:4)

需要语言规范中的特殊情况来禁止指向接口的指针。这使语言变得更加复杂。

为接口接口类型创建reflect.Type是指向接口的指针派上用场的一种方案:reflect.TypeOf((*io.Closer)(nil)).Elem()io.Closer的反射类型。

答案 1 :(得分:1)

只有我可以提出的例子,但从未使用过,也没有在野外看过,就是让另一个函数填充你的界面。

示例on Play。我无法想象一个需要它的情况。 正如其他人所指出的那样,不允许它可能是错误的,因为这会使编译器更复杂。

package main

import "fmt"

func main() {
    var s fmt.Stringer
    setMyStringer(&s)
    fmt.Println("Hello, stringer:", s)
}

func setMyStringer(target *fmt.Stringer) {
    *target = Stringable(5)
}

type Stringable int

func (s Stringable) String() string {
    return fmt.Sprint(int(s))
}