Структуры и интерфейсы

Go Interfaces

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

  • Средний
  • Чтение: 4 мин
  • Примеров для запуска: 1
Что вы узнаете
  • 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.

Главное

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

Пример на Go, который можно запустить

Go
Запустить код →
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)
	}
}
Получить кнопку запуска для этого примера Результат выполнения
circle: 3.14
rectangle: 7.00
radius: 1

Практика

Откройте пример в онлайн-компиляторе, измените значение или добавьте строку и попробуйте предсказать вывод до запуска. Затем намеренно сломайте код и прочитайте сообщение компилятора.

Закончили этот урок?

Отметьте его как изученный, чтобы следить за прогрессом.

Далее: Struct Embedding and Composition →

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи