Язык Go. Интерфейсы


Самая зубодробительная для новичков в golang — это интерфейсы. Приведу тут примеры кода, который я разбирал, чтобы их выкурить, надеюсь и вам поможет. Идея такая — смотрим код; потом закрываем его и по памяти пытаемся написать с нуля по данному плану:

  1. пишем код через обычные функции
  2. переделываем функции в методы
  3. добавляем интерфейс

Пример номер раз:ищем площадь и периметр круга и прямоугольника из Go by Example:

package main

import ("fmt"; "math")

type geometry interface {
    area() float64
    perim() float64
}

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) perim() float64 {
    return 2 * math.Pi * c.radius
}

func (r rect) area() float64 {
    return r.width * r.height
}

func (r rect) perim() float64 {
    return (r.width + r.height) * 2
}

func measure (g geometry) {
    fmt.Println(g.area())
    fmt.Println(g.perim())
}

func main() {
    r := rect {width: 3, height: 4}
    c := circle {radius: 5}

    measure(r)
    measure(c)
}

Пример номер два — нахождение площади и периметра круга и прямоугольника из книжки Калеба Докси «Введение в программирование на Go»:

package main

import ("fmt"; "math")


type Circle struct {
    x, y, r float64
}

type Rect struct {
    x1, y1, x2, y2 float64
}

func distance(x1, y1, x2, y2 float64) float64 {
    a := x2 - x1
    b := y2 - y1
    return math.Sqrt(a*a + b*b)
}

func (c *Circle) area() float64 {
    return math.Pi * c.r * c.r
}

func (r *Rect) area() float64 {
    l := distance(r.x1, r.y1, r.x1, r.y2)
    w := distance(r.x1, r.y1, r.x2, r.y1)
    return l * w
}

func (c *Circle) perimeter() float64 {
    return 2 * math.Pi * c.r
}

func (r *Rect) perimeter() float64 {
    l := distance(r.x1, r.y1, r.x1, r.y2)
    w := distance(r.x1, r.y1, r.x2, r.y1)
    return (l + w) * 2
}

type Shape interface {
    area() float64
    perimeter() float64
}

func totalArea (shapes ...Shape) float64 {
    var area float64
    for _, s := range shapes {
        area += s.area()
    }

    return area
}

func totalPerimeter (shapes ...Shape) float64 {
    var perimeter float64

    for _, s := range shapes {
        perimeter += s.perimeter()
    }
    return perimeter
}

func main() {
    c := Circle {0, 0, 5}
    r := Rect {0, 0, 10, 10}

    fmt.Println(c.area())
    fmt.Println(r.area())
    fmt.Println(c.perimeter())
    fmt.Println(r.perimeter())
    fmt.Println(totalArea(&c, &r))
    fmt.Println(totalPerimeter(&c, &r))
}


/* Example of interfaces' fields:

type MultiShape struct {
    shapes []Shape
}

func (m *MultiShape) area() float64 {
    var area float64
    for _, s := range m.shapes {
        area += s.area()
    }
    return area
}
*/

Пример номер три — животные из Jordan Orelli:

package main

import ("fmt")

type Animal interface {
    Speak() string
}

type Dog struct {}
func (d Dog) Speak() string {
    return "Woof!"
}

type Cat struct {}
func (c Cat) Speak() string {
    return "Meow!"
}

type Llama struct {}
func (l Llama) Speak() string {
    return "???"
}

type JavaProgrammer struct {}
func (j JavaProgrammer) Speak() string {
    return "Design patterns!"
}

func main() {
    animals := []Animal{ Dog{}, Cat{}, Llama{}, JavaProgrammer{} }

    for _, animal := range animals {
        fmt.Println(animal.Speak())
    }

}

Ну и для тех, кто хочет углубиться в интерфейсную нору как следует, вот статейка от Russ Cox.


Запись опубликована в рубрике Go. Добавьте в закладки постоянную ссылку.

5 комментариев на «Язык Go. Интерфейсы»

  1. Witcher говорит:

    Пофилософствую и порефлексирую немного 🙂
    В программировании важна цепкость и острота ума (иначе не получится проектировать сложные системы). На больших проектах нужна особая концентрация, отсутствие промедления и остановок в работе, иначе легко может начаться фрагментирование, многое забудется через несколько дней и «локомотив мысли» придётся разгонять многократно, что приведёт к лишним временным затратам. Вообще войти в это «состояние потока» не так-то просто. Особенно этому препятствует современный стиль жизни карнавального общества, расхлябанность, клиповое мышление, полупьяное замутнённое сознание (особенно после просмотра политических, развлекательных, юмористических передач). Какие-то простые вещи действительно можно делать по фану, но когда растёт сложность проекта — дорога программирования может оказаться не такой уж и привлекательной, во всяком случае подойдёт она далеко не каждому. Это надо иметь некую природную предрасположенность что ли, настоящую заинтересованость. Как-то так.

    • Компьютерщик говорит:

      для меня кодинг — это инструмент нужный для выполнения моих идей) это интересное и сложное занятие, но в первую очередь именно инструмент. как молоток или дрель

  2. Witcher говорит:

    Кстати, ты в курсе что ChatGPT умеет программировать на уровне джуниора? Ему достаточно на человеческом языке сформулировать задачу и он тебе выплюнет решение в виде готового кода на любом языке программирования, который запросишь. Потом можешь реквестировать объяснение что тебе не понятно — он объяснит любую деталь. Представленная нейросетевая модель GPT3.5 от OpenAI имеет развитое абстрактное и дедуктивное мышление, некое подобие интроспекции, богатая эрудиция, глубоко понимает смысл слов, выражений, имеет собственную модель мира, я сам проверял на множестве тестов, это потрясающее достижение. С этим АI можно беседовать на любую тему как с человеком. На гитхабе даже начали появляться хаки, как обойти его ограничения и заставить себя вести различными способами, например прикинуться терминалом линукса 🙂 или поиграть в текстовую игру — задавай любые правила текстового RPG и он сразу начнёт играть во что угодно. Помню как-то с тобой спорил на счёт того когда будет достигнут подобный фантастический уровень AI, чтоб игровые миры могли бы быть «живыми» в плане написания сценариев, определения геймплея, так вот реально не прошло и сто лет, сейчас это УЖЕ возможно. Попроси ChatGPT написать любой рассказ в стиле любого известного писателя — напишет. Я забавлялся Лавкрафтом, Стивеном Кингом, потрясающе генерирует красивый литературный осмысленный текст на английском на любую заданную тему с любой степенью детализации. Я бы так не написал! Вот это — реально БУДУЩЕЕ, которое наступило. Да, похоже человечество находится на пороге создания синтетического бога. Эта модель занимает всего около терабайта. Через пару месяцев обещают выкатить модель GPT4.0, на хабре уже некоторые воют что могут скоро потерять работу из-за распространения этой технологии 🙂 Да, мы на пороге серьёзной революции.

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.