Не программируйте интерфейсы, открывайте их.
1 Ұнайды
Рис. 2.7. Есть зависимость пакета store от пакета client
В пакете store мы определяем структуру InMemoryStore, реализующую интерфейс Store. Мы также создаем функцию NewInMemoryStore для возврата интерфейса Store. При таком дизайне есть зависимость пакета реализации от пакета потребителя, и это может показаться странным.
Например, пакет client больше не может вызывать функцию NewInMemoryStore, в противном случае возникла бы циклическая зависимость. Возможным решением может быть вызов этой функции из другого пакета и внедрение реализации Store в client. Однако обязанность сделать это означает, что такой дизайн должен быть оспорен.
Интерфейсы полезны для создания абстракций. И главное предостережение при знакомстве программиста с абстракциями — это помнить, что абстракции нужно открывать, а не создавать. Это означает, что мы не должны начинать создавать абстракции в коде, если для этого нет веской причины. Нужно не конструировать интерфейсы, а ждать возникновения конкретной потребности в них. Иными словами, создавайте интерфейс только тогда, когда он действительно нужен, а не тогда, когда возникает лишь ощущение, что он может понадобиться.
Мы можем определить несколько функций инициализации init для каждого пакета. В таком случае последовательность выполнения функции инициализации внутри пакета задается алфавитным порядком исходных файлов
Рис. 2.2. Сначала выполняется функция инициализации init из пакета redis, затем функция инициа
инициализации. Вот пример инициализации пакета main:
package main
import "fmt"
var a = func() int {
fmt.Println("var") Исполняется в первую очередь
return 0
}()
func init() {
fmt.Println("init") Исполняется во вторую очередь
}
func main() {
fmt.Println("main") Исполняется в последнюю очередь
}
Исполнение кода этого примера выведет следующее:
var
init
main
Итоги
• Go — это современный язык программирования, который позволяет повысить производительность разработчиков, что сегодня крайне важно для большинства компаний.
• Go прост в изучении, но нелегок в освоении. Поэтому важно углубить свои знания, чтобы использовать его наиболее эффективно.
• Обучение на разборе ошибок и на конкретных примерах — это мощный способ овладеть языком. Книга на примерах разбора 100 распространенных ошибок ускорит путь к профессиональному мастерству
библиотеки для создания эффективных конкурентных приложений. Наблюдение за тем, насколько важна конкурентность в наши дни, также показывает, почему Go сейчас самый подходящий язык и будет оставаться им в обозримом будущем
Оценка качества языка программирования на основании количества функций в нем, вероятно, некорректна. По крайней мере для Go эта метрика не главная. При оценке адекватности использования языка в масштабе какой-то организации используют несколько важных характеристик. К ним относятся:
• Стабильность. Несмотря на то что в Go вносятся частые изменения (направленные на улучшение самого языка и устранение уязвимостей с точки зрения безопасности), он остается достаточно стабильным языком. Некоторые считают это качество одной из лучших особенностей языка.
• Выразительность. Мы можем определить выразительность языка по тому, насколько написание и чтение кода отвечает представлениям о естественности и интуитивной понятности. Уменьшенное количество ключевых слов и ограниченные способы решения общих проблем делают Go выразительным языком для больших кодовых баз.
• Компиляция. Что может быть более раздражающим для разработчиков, чем долгое ожидание сборки для тестирования приложения? Стремление к быстрой компиляции всегда было сознательной целью разработчиков языка. А это основа высокой производительности.
• Безопасность. Go — надежный язык со статической типизацией. Следовательно, у него есть строгие правила времени компиляции, которые в большинстве случаев обеспечивают безопасность типов
Вот двоичное представление максимального значения int32 (math.MaxInt32):
01111111111111111111111111111111
