Structs and Interfaces

Go Interfaces

Describe behavior as a list of methods. Any type that has them satisfies the interface automatically.

  • Intermediate
  • 4 min read
  • 1 runnable example
What you'll learn
  • Defining an interface
  • Implicit implementation
  • any and type assertions
interface Shape
  • ShapeArea(), Name()
    • Circle
    • Rect

Behavior, not inheritance

An interface lists methods. Any type that has those methods satisfies the interface automatically: there is no implements keyword. Code written against the interface works with every such type.

Circle and Rect both have Area and Name, so both can be stored in a []Shape and passed to describe. any is the interface with no methods, which every value satisfies. value.(Circle) is a type assertion: ok is true when the value really is a Circle.

Key points

  1. There is no implements keyword.
  2. A []Shape can hold different types.
  3. value.(Circle) checks the real type.

Runnable Go example

Go
Run code →
main.go
package main

import (
	"fmt"
	"math"
)

type Shape interface {
	Area() float64
	Name() string
}

type Circle struct{ Radius float64 }
type Rect struct{ Width, Height float64 }

func (c Circle) Area() float64 { return math.Pi * c.Radius * c.Radius }
func (c Circle) Name() string  { return "circle" }
func (r Rect) Area() float64   { return r.Width * r.Height }
func (r Rect) Name() string    { return "rectangle" }

func describe(shape Shape) {
	fmt.Printf("%s: %.2f\n", shape.Name(), shape.Area())
}

func main() {
	shapes := []Shape{Circle{Radius: 1}, Rect{Width: 2, Height: 3.5}}
	for _, shape := range shapes {
		describe(shape)
	}

	var value any = shapes[0]
	if circle, ok := value.(Circle); ok {
		fmt.Println("radius:", circle.Radius)
	}
}
Get a Run button for this example Result of running the code
circle: 3.14
rectangle: 7.00
radius: 1

Practice

Open the example in the online compiler, change a value or add a line, and predict the output before you run it. Then break the code on purpose and read the compiler's message.

Finished this lesson?

Mark it as learned to track your progress.

Practice with a challenge

Use what this lesson covers to solve a real problem. Each challenge runs in your browser with instant tests and an AI review.

All challenges