una programa polimorfico nivel herencia general estructura ejemplo consola clase arreglos go

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 .