在我写作Go代码的过程中,我从来没有遇到过任何情况,也不能想到需要使用指向接口的指针,除非可能编写一个大量使用运行时反射的库。 Some people暗示有这样的事实存在正当的理由,但似乎从未进一步阐述。这个功能似乎也对开始使用Go的开发人员造成了一些混乱。Go为什么允许指向接口的指针?
main.go:22: cannot use &a (type *A) as type **interface {} in argument to run
什么是使用接口指针的好例子?
在我写作Go代码的过程中,我从来没有遇到过任何情况,也不能想到需要使用指向接口的指针,除非可能编写一个大量使用运行时反射的库。 Some people暗示有这样的事实存在正当的理由,但似乎从未进一步阐述。这个功能似乎也对开始使用Go的开发人员造成了一些混乱。Go为什么允许指向接口的指针?
main.go:22: cannot use &a (type *A) as type **interface {} in argument to run
什么是使用接口指针的好例子?
语言规范中的特殊情况需要禁止指向接口的指针。这使得语言更加复杂。
为接口接口类型创建一个reflect.Type
是指向接口的指针派上用场的一种场景:reflect.TypeOf((*io.Closer)(nil)).Elem()
是io.Closer
的反射类型。
唯一的例子我能想出的,但从来没有使用过,也没有见过在野外,就是让另一个函数填充你的界面。
示例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))
}
你只是看着它错了。为什么你不应该允许它?没有一个令人信服的理由(没有我所关心的),没有理由明确地不允许它。 – evanmcdonnal
没有看到有关该主题的任何混淆。我阅读了许多关于人们学习Go的文章,并指出了一些有关它的奇怪或坏东西,但从未指向接口。这是在实践中几乎不需要的东西,所以你甚至不应该考虑。限制它 - 这会使语言更复杂,没有任何明显的好处。这是可能的,自然不符合规范,为什么限制它。我甚至都不记得在任何Go教程或书籍中看到这个功能。 – creker
相关/例如:[在Golang中将接口设置为零](http://stackoverflow.com/questions/33841630/set-an-interface-to-nil-in-golang) – icza