Интерфейсы

Интерфейс в Go реализуется неявно: если тип реализует все методы интерфейса — он его реализует. Никакого implements.

type Stringer interface {
    String() string
}

type User struct{ Name string }

func (u User) String() string {
    return "User:" + u.Name
}

var s Stringer = User{Name: "Alice"}
fmt.Println(s.String())   // User:Alice
type Shape interface {
    Area() float64
}

func printArea(s Shape) {
    fmt.Printf("площадь: %.2f\n", s.Area())
}

printArea(Rect{3, 4})
printArea(Circle{5})

any (псевдоним interface{}) принимает значение любого типа:

func dump(v any) {
    fmt.Printf("%T = %v\n", v, v)
}
var s Stringer = User{"Bob"}

u, ok := s.(User)   // type assertion
if ok {
    fmt.Println(u.Name)
}

switch v := s.(type) {
case User:
    fmt.Println("User:", v.Name)
case fmt.Stringer:
    fmt.Println("Stringer:", v.String())
}

ЗаданиеСложность
1Упражнение 1easy
2Упражнение 2medium
3Упражнение 3hard