【问题标题】:Why does Go allow pointers to interfaces? [closed]为什么 Go 允许指向接口的指针? [关闭]
【发布时间】:2016-07-24 16:39:23
【问题描述】:

在我编写 Go 代码的过程中,我从未遇到过,也没有想到需要使用指向接口的指针的案例,除了可能编写一个大量使用运行时反射的库。 Some people 暗示这样做是有正当理由的,但似乎从未进一步详细说明。这个特性似乎也让刚开始使用 Go 的开发人员感到困惑。

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

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

【问题讨论】:

  • 你只是看错了。为什么你不应该允许它?如果没有令人信服的理由不这样做(就我而言没有),就没有理由明确不允许这样做。
  • 没有看到关于该主题的任何混淆。我读了很多关于人们学习 Go 的文章,并指出了一些奇怪或不好的东西,但从来没有指向接口。这是在实践中几乎不需要的东西,所以你甚至不应该考虑。限制它 - 它会使语言更复杂而没有任何明显的好处。这是可能的,自然不符合规范,所以为什么要限制它。我什至不记得在任何 Go 教程或书籍中看到过此功能。
  • Go 程序在 nil 指针上实现接口是完全合法的。

标签: pointers reflection go interface


【解决方案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))
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多