Утиная типизация (duck typing) - что это в программировании

Утиная типизация (duck typing) — шуточный темин, описывающий реальную ситуацию, а именно:
- это концепция в программировании, при которой совместимость типов определяется не наследованием, а наличием необходимых методов и свойств у объекта во время выполнения.

Почему "утиная"

Название термина пошло от английского «duck test» («утиный тест»), суть которого выражается как:

Если нечто выглядит, как утка, плавает, как утка, и крякает, как утка, то это, вероятно, и есть утка.

#20.1 golang Каналы - с буфером и без, состояние блокировки, взаимоблокировки deadlock

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

В языке Go канал имеет определенный тип, то есть тип значений, которые он может передавать из одной горутины в другую. Для определения канала применяется ключевое слово chan:

chan тип_элемента

-- фактически так объявляется что-то вподе составного типа, т.е. на пример "канал целых чисел".

Ниже мы посмотрим как это работает в коде.

#19.1 golang Горутины и работа с ними - асинхронного выполнение, многопоточность, гонка данных

Ранее мы упоминали горутины — это легковесные потоки выполнения в Go, работающие поверх системных потоков (threads).

Они позволяют запускать функции параллельно (асинхронно). Давайте посмотрим как это делается в коде

Асинхронное выполнение кода

Ты можешь запустить функцию в горутине, добавив перед её вызовом ключевое слово go:

#18.2 golang go test Автоматическое тестирование - пример программы

Напишем простую программу для "уникализации" строк, которые подаются в стандартный ввод:

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	in := bufio.NewScanner(os.Stdin)
	var prev string
	// потенциально бесконечный цикл:
	for in.Scan() {
		txt := in.Text()
		if txt == prev {
			continue
		}
		if txt < prev {
			panic("Строки не отсортированы!")
		}
		prev = txt
		fmt.Println(txt)
	}
}

(при запуске в vscode возможна проблема, но есть решение)

#17.3 golang Композиция интерфейсов

Интерфейсы, как и структуры поддерживают композицию.

Мы можем встраивать один интерфейс в другой, тем самым образуя более сложные интерфейсы и создавая композиции интерфейсов.

Давайте рассмотрим пример:

#17.2 Пустой интерфейс - какой угодно тип (тип any)

Начиная с версии Go 1.18, появился тип any, он является синонимом на interface{} (пустой интерфейс).

Пример использования в стандартных функциях

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

linux Освобождаем место в разделе /boot в т.ч. для обновления версии ОС

Общая идея

Будем чистить раздел /boot от старых вещей, напр. чтобы справиться с ошибкой типа "The upgrade needs a total of ... free space on disk '/boot'"

Контроль свободного места:

 df -h /boot

Версия текущего ядра, файлы с подобным именем нельзя трогать:

#17 golang Интерфейсы - проверка типа type switch

Через интерфейсы в Go реализован полиморфизм.

В отличие от таких языков, как C++, Java и PHP, где типизация всегда явная, в Go при помощи интерфейсов реализована так называемая «утиная типизация».

Что это значит:

#16 golang Методы - функции для структур и других получателей

Метод — это функция, которая может быть привязана к определённому типу данных. Такой тип данных называется получателем ()

В основе этих типов могут лежать как структуры, так и int, string и любые другие доступные типы в Go.

Привязывание методов к структурам

Для начала рассмотрим методы, которые привязываются к структурам.

Определим именованный тип Person и пару методов к нему, а также проверим как они работают:

Композиция - что это в программировании, проектировании

Композиция - способ получения функционала, путем прямого "присоединения" новых функций/полей.

В отличии от Наследования (которому композицию часто протипоставляют как "более гибкий" подход), для получения функционала тут не требуется объявляет иерархию между сущностями.

Pages

Subscribe to fkn+antitotal RSS