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 un Interface
, ¿por qué no *Struct
sería un *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
func main() { var ps *Struct = new(Struct) var pi *Interface var i Interface i = ps pi = &i fmt.Printf("%v, %v, %v\n", *ps, pi, &i) i = *ps fmt.Printf("%v, %v, %v\n", *ps, pi, i) _, _, _ = i, pi, ps }
y hacer sus propias conclusionesRespuestas:
Cuando tiene una estructura que implementa una interfaz, un puntero a esa estructura implementa automáticamente esa interfaz también. Es por eso que nunca tiene
*SomeInterface
en el prototipo de funciones, ya que esto no agregaría nadaSomeInterface
, y no necesita ese tipo de declaración de variable (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 una especie de puntero (para ser más precisos, un puntero a la estructura y un puntero al tipo ) Russ Cox lo describe exactamente aquí :
Esta es la razón
Interface
, y no*Interface
es el tipo correcto para mantener un puntero a una implementación de estructuraInterface
.Entonces simplemente debes usar
fuente
var pi *Interface
.*SomeInterface
no es simplemente un error de compilación?Esto es quizás lo que quisiste decir:
Compila bien. Ver también aquí .
fuente
Aquí hay una manera muy simple de asignar una estructura a una interfaz:
https://play.golang.org/p/BRTaTA5AG0S
fuente
Estoy usando la siguiente forma de,
interface{}
aunque solo estoy consumiendoeventsI interface{}
como argumentos, todavía puedo enviar un Struct Pointers como se puede ver a continuación.main.go
Ahora dentro de
storyboard.go
la función Crear archivoComo puede ver arriba, el Storyboard.go está consumiendo solo,
Events []interface{}
pero de hecho, Im send es un puntero Struct y funciona bien.otro ejemplo más aquí
fuente