Thank Go! @thank_go Channel on Telegram

Thank Go!

Thank Go!
Неожиданный взгляд на язык программирования Go. Конструктив от @mikeberezin с нотками сарказма от @nalgeon
2,372 Subscribers
3 Photos
94 Videos
Last Updated 01.03.2025 05:53

Неожиданный взгляд на язык программирования Go

Язык программирования Go, разработанный Google, стал популярным инструментом для создания высокопроизводительных приложений и сервисов. С момента его появления в 2009 году, Go привлек внимание разработчиков своей простотой и эффективностью. Однако, несмотря на множество положительных аспектов, язык также подвергается критике. Интересный взгляд на Go был представлен в статье конструктивного критика @mikeberezin, где он в сочетании с сарказмом от @nalgeon подчеркивает как сильные, так и слабые стороны этой технологии. В этой статье мы рассмотрим ключевые моменты, затронутые авторами, и ответим на наиболее часто задаваемые вопросы, чтобы дать читателям полное представление о языке программирования Go.

Каковы основные преимущества языка Go?

Одним из главных преимуществ Go является его простота и лаконичность. Язык был создан с целью устранения недостатков других языков, таких как C++ и Java. Его синтаксис минималистичен, что упрощает процесс обучения и написания кода. Это позволяет разработчикам быстрее создавать приложения, уменьшает количество ошибок и облегчает чтение кода.

Помимо этого, Go предлагает отличную поддержку для параллельного программирования благодаря встроенным горутинам и каналам. Это позволяет разрабатывать высокопроизводительные приложения, которые эффективно используют ресурсы процессоров. Благодаря этим возможностям Go стал идеальным выбором для создания облачных сервисов и микросервисов.

С какими проблемами сталкиваются разработчики, используя Go?

Одной из проблем, с которыми сталкиваются разработчики, является ограниченная гибкость языка, когда дело доходит до объектно-ориентированного программирования. В Go отсутствует наследование классов, что может вызвать трудности при проектировании более сложных приложений. Это ограничение иногда приводит к необходимости искать обходные пути или использовать альтернативные паттерны проектирования.

Также стоит упомянуть о том, что на момент написания, экосистема Go все еще не так развита, как у более популярных языков, таких как Python или Java. Это может ограничить выбор библиотек и инструментов, доступных для разработчиков, что иногда ведет к необходимости написания дополнительного кода или реализации функций самостоятельно.

Как язык Go справляется с обработкой ошибок?

Обработка ошибок в Go реализована с помощью многоуровневой системы возврата ошибок, которая отличается от традиционных исключений, используемых в других языках. Каждый раз, когда функция может завершиться неудачей, она возвращает ошибку как дополнительный параметр. Это позволяет разработчикам явно контролировать логику обработки ошибок и делать код более предсказуемым.

Однако такая система имеет свои недостатки. Часто разработчики забывают проверять эти ошибки, что может привести к незаметным сбоям. Некоторые критикуют эту систему за избыточность, так как она требует от разработчиков не только написания основной логики, но и постоянного внимания к обработке ошибок.

В чем особенности синтаксиса языка Go?

Синтаксис Go был разработан так, чтобы быть интуитивно понятным и простым. Он сочетает в себе элементы из других языков, таких как C и Python, но при этом остается уникальным. Например, в Go есть четкая структура пакетов, что упрощает организацию кода и делает его более модульным и повторно используемым.

Еще одной особенностью Go является его система управления памятью, основанная на сборке мусора. Это упрощает разработку, позволяя избежать многих проблем, связанных с ручным управлением памятью, как в C или C++. Тем не менее, это может привести к проблемам с производительностью, особенно в высоконагруженных приложениях.

Как язык Go влияет на производительность приложений?

Одной из причин популярности Go является его высокая производительность. Язык компилируется в машинный код, что обеспечивает быструю работу приложений. Благодаря оптимизации компилятора, программы на Go могут работать почти так же быстро, как программы на C, при этом оставаясь намного проще в написании и поддержке.

Кроме того, возможности параллельного программирования, предоставляемые горутинами, позволяют Go эффективно использовать многопроцессорные системы. Это делает его отличным выбором для разработки серверных приложений и высоконагруженных сервисов, которые должны обрабатывать множество запросов одновременно.

Thank Go! Telegram Channel

Спасибо Go! - это канал, который предлагает неожиданный взгляд на язык программирования Go. Основатели канала @thank_go, @mikeberezin и @nalgeon, приглашают вас исследовать этот язык программирования через призму юмора и сарказма. Если вы хотите узнать больше о Go и при этом получить порцию хорошего настроения, то этот канал - идеальное место для вас. @mikeberezin и @nalgeon делятся своими перлами и инсайтами, делая изучение Go увлекательным и интересным. Присоединяйтесь к каналу Спасибо Go! прямо сейчас и погрузитесь в мир программирования с улыбкой на лице!

Thank Go! Latest Posts

Post image

Go 1.24: Случайный текст

Небольшое, но весьма приятное дополнение стандартной библиотеки.

Появилась функция crypto/rand.Text, которая возвращает криптографически случайную строку:

text := rand.Text()
fmt.Println(text)
// 4PJOOV7PVL3HTPQCD5Z3IYS5TC


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

Использует алфавит Base32.

25 Feb, 14:59
1,138
Post image

Метод-значение

Это вы конечно молодцы, что так хорошо знаете возможности языка!

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

Предположим, у нас есть тип-монитор, который умеет периодически проверять доступность сервиса, ведет историю проверок, считает процент доступности и выполняет другие полезные действия.

Монитору совершенно не нужно знать о конкретной реализации сервиса. Достаточно получить в конструкторе функцию-пинг, и дальше вызывать ее:

type Monitor struct {
ping func() error
// ...
}

func NewMonitor(ping func() error) *Monitor {
return &Monitor{ping}
}


И если у нашего сервера есть подходящий по сигнатуре метод:

func (s *Server) Ping() error {
// ...
}


То можно прямо его и передать без всяких оберток:

s := Server{}
m := NewMonitor(s.Ping)


Такие вот элементы функционального программирования в глубоко процедурном языке :)

23 Feb, 14:01
1,319
Post image

Странный пингер

Допустим, у нас есть сервер, который можно тыкать палочкой:

type Server struct {
nPings int
}

func (s *Server) Ping() {
s.nPings++
}


Давайте попингуем его вот так:

s := Server{}
ping := s.Ping // хм

ping()
ping()
ping()


Как думаете, что произойдет?

Опрос следует (чур в комментах не спойлерить)

22 Feb, 13:43
1,545
Post image

Go 1.24: пропуск нулевых значений в JSON

Новая опция omitzero инструктирует JSON-маршалер пропускать нулевые значения.

Вообще у нас уже был для этого omitempty, но omitzero вроде как поудобнее будет. Например, он пропускает нулевые значения time.Time, чего omitempty делать не умеет.

Вот omitempty:

type Person struct {
Name string `json:"name"`
BirthDate time.Time `json:"birth_date,omitempty"`
}

alice := Person{Name: "Alice"}
b, err := json.Marshal(alice)
fmt.Println(string(b))


{"name":"Alice","birth_date":"0001-01-01T00:00:00Z"}


А вот omitzero:

type Person struct {
Name string `json:"name"`
BirthDate time.Time `json:"birth_date,omitzero"`
}

alice := Person{Name: "Alice"}
b, err := json.Marshal(alice)
fmt.Println(string(b))


{"name":"Alice"}


Если у типа есть метод IsZero() bool — именно он используется при маршалинге, чтобы определить, нулевое значение или нет.

Если метода нет, используется стандартное понятие нулевого значения (0 для целого, "" для строки, и так далее).

Наверно, стоило бы сразу задизайнить так omitempty, но кто же знал :)

21 Feb, 14:25
1,970