pointers - 指向接口(interface)的指针是不是接口(interface)错误?

标签 pointers inheritance go

以下代码有效:

type Brace interface {}

type Round struct {
    prev_ Brace
}

type Square struct {}

func main() {
    var r Round
    var s Square
    r.prev_ = s
}

r.prev_ 现在是 s 的副本是真的吗?如何更改 Round 将包含指向 Brace 的指针?此代码不起作用:

type Brace interface {}

type Round struct {
    prev_ *Brace
}

type Square struct {}

func main() {
    var r Round
    var s Square
    r.prev_ = &s
}

因为错误:

cannot use &s (type *Square) as type *Brace in assignment: *Brace is pointer to interface, not interface

最佳答案

如错误所述:

cannot use &s (type *Square) as type *Brace in assignment: *Brace is pointer to interface, not interface

接口(interface)可以包装任何类型的值。但是您将结构包装在指针类型接口(interface)而不是接口(interface)中。这不是接口(interface)在 golang 中的工作方式。

如果你想传递一个结构体的地址。接口(interface)可以直接将指针包装到结构。无需创建指向接口(interface)的指针即可实现该目的。

type Brace interface {}

type Round struct {
    prev_ Brace
}

type Square struct {}

func main() {
    var r Round
    var s Square
    r.prev_ = &s
    fmt.Printf("%#v", r)
}

Playground Example

在 Golang 中,您应该避免将指针传递给接口(interface):

The compiler will complain about this error but the situation can still be confusing, because sometimes a pointer is necessary to satisfy an interface. The insight is that although a pointer to a concrete type can satisfy an interface, with one exception a pointer to an interface can never satisfy an interface.

考虑变量声明,

var w io.Writer

打印函数 fmt.Fprintf 将满足 io.Writer 的值作为其第一个参数——实现规范 Write 方法的东西。这样我们就可以写

fmt.Fprintf(w, "hello, world\n")

但是,如果我们传递 w 的地址,程序将无法编译。

fmt.Fprintf(&w, "hello, world\n") // Compile-time error.

The one exception is that any value, even a pointer to an interface, can be assigned to a variable of empty interface type (interface{}). Even so, it's almost certainly a mistake if the value is a pointer to an interface; the result can be confusing.

Go playground 上查看.当您尝试将指针传递给接口(interface)时,您会发现您在代码片段中遇到的错误。

关于pointers - 指向接口(interface)的指针是不是接口(interface)错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51611086/

相关文章:

c - 为什么即使在函数返回后对单个指针所做的更改仍然存在

c++ - C++-将元素按升序插入数组时出现段错误

c - 函数获取右指针但返回 NULL

go - 可以将 golang channel 绑定(bind)到模板中

go - 为什么 GoLang 方法给出编译错误?

javascript - Golang 的 syscall/js js.NewCallback 未定义

c - 用户输入的字符串在 c 中运行特定函数

c++ - 在 C++ 中从自身派生模板类

C++调用函数导致调用另一个函数

C++ 不明确的双非虚函数继承