Alias Type Definitions do not Inherit Underlying Type Methods

Evan Hicks
—The Problem
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() }
The Solution
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.
Further Reading
- SentryGo Error Tracking and Performance Monitoring (opens in a new tab)
- Syntax.fmListen to the Syntax Podcast (opens in a new tab)
- Listen to the Syntax Podcast (opens in a new tab)
![Syntax.fm logo]()
Tasty treats for web developers brought to you by Sentry. Get tips and tricks from Wes Bos and Scott Tolinski.
SEE EPISODES
Considered “not bad” by 4 million developers and more than 150,000 organizations worldwide, Sentry provides code-level observability to many of the world’s best-known companies like Disney, Peloton, Cloudflare, Eventbrite, Slack, Supercell, and Rockstar Games. Each month we process billions of exceptions from the most popular products on the internet.
