Golang 中为什么不能将一个 *Struct 赋值给一个 *Interface?

我只是在研究 Go tour,我对指针和接口感到困惑。为什么这个 Go 代码不能编译?

package main


type Interface interface {}


type Struct struct {}


func main() {
var ps *Struct
var pi *Interface
pi = ps


_, _ = pi, ps
}

也就是说,如果 StructInterface,为什么 *Struct不是 *Interface呢?

我得到的错误消息是:

prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment:
*Interface is pointer to interface, not interface
73517 次浏览

也许这就是你的意思:

package main


type Interface interface{}


type Struct struct{}


func main() {
var ps *Struct
var pi *Interface
pi = new(Interface)
*pi = ps


_, _ = pi, ps
}

编译正常。请参阅 给你

当您有一个实现接口的结构时,指向该结构的指针也会自动实现该接口。这就是为什么在函数的原型中从来没有 *SomeInterface的原因,因为它不会向 SomeInterface添加任何内容,而且在变量声明中也不需要这样的类型(参见 这个相关的问题)。

接口值不是具体结构的值(因为它有一个可变的大小,这是不可能的) ,而是一种指针(更准确地说,是一个指向结构的指针和一个指向类型的指针)。拉斯•考克斯(Russ Cox)恰如其分地描述了 给你:

接口值表示为两个字对,给出一个指针 指向有关存储在接口中的类型的信息,并指向 相关数据。

enter image description here

这就是为什么 Interface而不是 *Interface是保存指向实现 Interface的结构的指针的正确类型。

所以你必须简单地使用

var pi Interface

这里有一个非常简单的方法来为接口分配结构:

package main


type Interface interface{}


type Struct struct{}


func main() {
ps := new(Struct)
pi := Interface(ps)


_, _ = pi, ps
}

Https://play.golang.org/p/brtata5ag0s

我使用以下的 interface{}方式,而我只是使用 eventsI interface{}作为参数,我仍然能够发送一个结构指针,如你可以看到下面。

func Wait(seconds float64) *WaitEvent {
return WaitEventCreate(seconds)
}

总部,开始

var introScene = []interface{}{
storyboard.Wait(5),
storyboard.Wait(2),
}


var storyboardI = storyboard.Create(stack, introScene)
stack.Push(&storyboardI)

现在在 storyboard.go文件中创建函数

type Storyboard struct {
Stack  *gui.StateStack
Events []interface{} //always keep as last args
}


func Create(stack *gui.StateStack, eventsI interface{}) Storyboard {
sb := Storyboard{
Stack: stack,
}


if eventsI != nil {
events := reflect.ValueOf(eventsI)
if events.Len() > 0 {
sb.Events = make([]interface{}, events.Len())
for i := 0; i < events.Len(); i++ {
sb.Events[i] = events.Index(i).Interface()
}
}
}


return sb
}

正如你在 Storyboard.go 上面看到的,它只使用 Events []interface{},但实际上,IM 发送是一个结构指针,它工作得很好。

另一个例子 给你