Why can't I assign a *Struct to an *Interface?

go

Solution

When you have a struct implementing an interface, a pointer to that struct implements automatically that interface too. That's why you never have `*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 Interface

Problem

I'm just working through the Go tour, and I'm confused about pointers and interfaces. Why doesn't this Go code compile? ``` 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 interface ```

Original source

Related problems