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.