2016-04-04 34 views
2

在我写作Go代码的过程中,我从来没有遇到过任何情况,也不能想到需要使用指向接口的指针,除非可能编写一个大量使用运行时反射的库。 Some people暗示有这样的事实存在正当的理由,但似乎从未进一步阐述。这个功能似乎也对开始使用Go的开发人员造成了一些混乱。Go为什么允许指向接口的指针?

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

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

+2

你只是看着它错了。为什么你不应该允许它?没有一个令人信服的理由(没有我所关心的),没有理由明确地不允许它。 – evanmcdonnal

+3

没有看到有关该主题的任何混淆。我阅读了许多关于人们学习Go的文章,并指出了一些有关它的奇怪或坏东西,但从未指向接口。这是在实践中几乎不需要的东西,所以你甚至不应该考虑。限制它 - 这会使语言更复杂,没有任何明显的好处。这是可能的,自然不符合规范,为什么限制它。我甚至都不记得在任何Go教程或书籍中看到这个功能。 – creker

+1

相关/例如:[在Golang中将接口设置为零](http://stackoverflow.com/questions/33841630/set-an-interface-to-nil-in-golang) – icza

回答

4

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

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

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)) 
} 
相关问题