Type definitions do not inherit underlying type methods.
Compile Error: ./prog.go:17:3: b.Print undefined (type Bar has no field or method Print)
package main import ( "fmt" ) type Foo struct{} func (f Foo) Print() { fmt.Println("foo") } type Bar Foo func main() { b := Bar{} b.Print() }
Go does not have traditional inheritance like other languages, therefore the alias type declaration type Bar Foo
works differently in Go. When you create a new type based on another type, your new type (Bar
) doesn’t inherit the methods from Foo
, which is why b.Print
is undefined
.
The fix:
package main import ( "fmt" ) type Foo struct{} func (f Foo) Print() { fmt.Println("foo") } type Bar struct { Foo } func main() { b := Bar{} b.Print() }
This creates a new type Bar
, and embeds it with an implicit Foo
object. In this case, when you call a method on a Bar
object, it will check to see if Bar
has that method, and if it doesn’t, it will check Foo
for the method and use that.