patterngoCritical
Why can't I assign a *Struct to an *Interface?
Viewed 0 times
structwhyinterfacecanassign
Problem
I'm just working through the Go tour, and I'm confused about pointers and interfaces. Why doesn't this Go code compile?
i.e. if
The error message I get is:
package main
type Interface interface {}
type Struct struct {}
func main() {
var ps *Struct
var pi *Interface
pi = ps
_, _ = pi, ps
}i.e. if
Struct is an Interface, why wouldn't a Struct be a Interface?The error message I get is:
prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment:
*Interface is pointer to interface, not interfaceSolution
When you have a struct implementing an interface, a pointer to that struct implements automatically that interface too. That's why you never have
An interface value isn't the value of the concrete struct (as it has a variable size, this wouldn't be possible), but it's a kind of pointer (to be more precise a pointer to the struct and a pointer to the type). Russ Cox describes it exactly here :
Interface values are represented as a two-word pair giving a pointer
to information about the type stored in the interface and a pointer to
the associated data.
This is why
So you must simply use
*SomeInterface in the prototype of functions, as this wouldn't add anything to SomeInterface, and you don't need such a type in variable declaration (see this related question).An interface value isn't the value of the concrete struct (as it has a variable size, this wouldn't be possible), but it's a kind of pointer (to be more precise a pointer to the struct and a pointer to the type). Russ Cox describes it exactly here :
Interface values are represented as a two-word pair giving a pointer
to information about the type stored in the interface and a pointer to
the associated data.
This is why
Interface, and not *Interface is the correct type to hold a pointer to a struct implementing Interface.So you must simply use
var pi InterfaceCode Snippets
var pi InterfaceContext
Stack Overflow Q#13511203, score: 228
Revisions (0)
No revisions yet.