在我编写Go代码的过程中,我从未遇到过一个案例,也没有想到一个需要使用指向接口的指针,除了编写一个大量使用运行时反射的库。 Some people提到有充分理由这样做,但似乎从未进一步阐述。这个功能似乎也对开始使用Go的开发人员造成了相当大的困惑。
main.go:22: cannot use &a (type *A) as type **interface {} in argument to run
使用接口指针的好例子是什么?
答案 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))
}