go - programa - ¿Por qué no puedo asignar un*Struct a una*Interfaz?
herencia struct c# (2)
Solo estoy trabajando en la gira Go , y estoy confundido acerca de los punteros y las interfaces. ¿Por qué no compila este código Go?
package main
type Interface interface {}
type Struct struct {}
func main() {
var ps *Struct
var pi *Interface
pi = ps
_, _ = pi, ps
}
es decir, si Struct
es una Interface
, ¿por qué un *Struct
sería una *Interface
?
El mensaje de error que recibo es:
prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment:
*Interface is pointer to interface, not interface
Cuando tiene una estructura que implementa una interfaz, un puntero a esa estructura también implementa automáticamente esa interfaz. Es por eso que nunca tiene *SomeInterface
en el prototipo de funciones, ya que esto no agregaría nada a SomeInterface
, y no necesita ese tipo en la declaración de variables (vea esta pregunta relacionada ).
Un valor de interfaz no es el valor de la estructura concreta (ya que tiene un tamaño variable, esto no sería posible), pero es un tipo de puntero (para ser más preciso, un puntero a la estructura y un puntero al tipo ) Russ Cox lo describe exactamente here :
Los valores de la interfaz se representan como un par de dos palabras que proporciona un puntero a la información sobre el tipo almacenado en la interfaz y un puntero a los datos asociados.
Esta es la razón por la cual Interface
, y no *Interface
es el tipo correcto para mantener un puntero a una Interface
implementación de struct.
Entonces simplemente debes usar
var pi Interface
Esto es quizás lo que querías decir:
package main
type Interface interface{}
type Struct struct{}
func main() {
var ps *Struct
var pi *Interface
pi = new(Interface)
*pi = ps
_, _ = pi, ps
}
Compila OK. Ver también here .