Estou apenas trabalhando no tour Go e estou confuso sobre ponteiros e interfaces. Por que esse código Go não é compilado?
package main
type Interface interface {}
type Struct struct {}
func main() {
var ps *Struct
var pi *Interface
pi = ps
_, _ = pi, ps
}
ou seja, se Struct
é um Interface
, por que não *Struct
seria um *Interface
?
A mensagem de erro que recebo é:
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 }
e fazer suas próprias conclussionsRespostas:
Quando você tem uma estrutura implementando uma interface, um ponteiro para essa estrutura também implementa automaticamente essa interface. É por isso que você nunca possui
*SomeInterface
o protótipo de funções, pois isso não adicionaria nada a issoSomeInterface
e você não precisa desse tipo de declaração de variável (consulte esta pergunta relacionada ).Um valor de interface não é o valor da estrutura concreta (como tem um tamanho variável, isso não seria possível), mas é um tipo de ponteiro (para ser mais preciso, um ponteiro para a estrutura e um ponteiro para o tipo ) Russ Cox descreve exatamente aqui :
É por isso que
Interface
, e não,*Interface
é o tipo correto para armazenar um ponteiro para uma implementação de estruturaInterface
.Então você deve simplesmente usar
fonte
var pi *Interface
.*SomeInterface
não é simplesmente um erro de compilação?Talvez seja isso que você quis dizer:
Compila OK. Veja também aqui .
fonte
Aqui está uma maneira muito simples de atribuir uma estrutura a uma interface:
https://play.golang.org/p/BRTaTA5AG0S
fonte
Estou usando a seguinte maneira de
interface{}
consumir apenaseventsI interface{}
argumentos, mas ainda posso enviar um ponteiro de estrutura como você pode ver abaixo.main.go
Agora dentro da
storyboard.go
função Criar arquivoComo você pode ver acima, o Storyboard.go está consumindo apenas,
Events []interface{}
mas, na verdade, estou enviando um ponteiro Struct e funciona bem.outro exemplo mais aqui
fonte