Struct e interfacce

Go Interfaces

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

  • Intermedio
  • 4 min di lettura
  • 1 esempio eseguibile
Cosa imparerai
  • 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.

Punti chiave

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

Esempio Go eseguibile

Go
Esegui il codice →
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)
	}
}
Crea un pulsante Run per questo esempio Risultato dell'esecuzione
circle: 3.14
rectangle: 7.00
radius: 1

Esercitati

Apri l'esempio nel compilatore online, cambia un valore o aggiungi una riga e prova a prevedere l'output prima di eseguirlo. Poi rompi il codice di proposito e leggi il messaggio del compilatore.

Hai finito questa lezione?

Segnala come imparata per tenere traccia dei tuoi progressi.

Esercitati con una sfida

Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.

Tutte le sfide