Итак, вот совет, который вначале может показаться контринтуитивным — используйте функцию
Must
для преднамеренной остановки вашей программы.Странно, да? И правда, обычно мы стараемся избегать ситуаций, когда наша программа может запаниковать, но есть исключения, когда использование
Must
сокращает громоздкость. Если вы работали с Go, по-любому вы уже видели эти функции в стандартной библиотеке.
Чуть подробнее: функция
Must
принимает как аргумент другую функцию, и если та вернёт ошибку, то Must
вызывает панику. Must
в основном используются для:Must
также очень полезны в сценариях тестирования, позволяя немедленно прервать тест с помощью t.Fatal
: Функции Must
являются инструментами для инициализации и тестирования, где мы не ожидаем получить ошибку.Итак, функция
Must
упрощает обработку ошибок в определенных контекстах, но следует использовать её осторожно.@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Это простое приложение для обмена сообщениями, созданное с помощью Go и Vue.js.
Пользователи могут создавать чаты-комнаты для общениеи.
Приложение использует WebSockets для общения в режиме реального времени.
▪Github
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
time.Time
в Go time.Unix()
:package main
import (
"fmt"
"time"
)
func main() {
unixTime := time.Unix(1589570165, 0) // 0 - это число наносекунд
fmt.Println(unixTime)
}
// 2020-05-15 22:16:05 +0300 MSK
time
предусмотрены специальные функции time.UnixMilli
и time.UnixMicro
:package main
import (
"fmt"
"time"
)
func main() {
unixTimeMilli := time.UnixMilli(1589570165123)
unixTimeMicro := time.UnixMicro(1589570165123456)
fmt.Println("millis: ", unixTimeMilli)
fmt.Println("micros: ", unixTimeMicro)
}
// millis: 2020-05-15 19:16:05.123 +0000 UTC
// micros: 2020-05-15 19:16:05.123456 +0000 UTC
Пользуйтесь
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Здесь описывается абсолютно всё, что поможет подготовиться к собеседованию, и даже больше
Вопросы с собеседований связанные с Golang
├── Общие вопросы
├── Хеш-мапы
├── Интерфейсы
├── Пакеты
├── Типы данных
├── Defer
├── Примитивы синхронизации
├── Планировщик
├── Строки
├── Массивы и слайсы
├── Дженерики
├── Горутины
├── Конструкции
├── Гонка данных
├── Структуры
├── Контекст
├── Ошибки / Panic
└── Указатели
Вопросы с собеседований связанные с Linux
├── Файловая система
└── Сигналы, процессы
Вопросы по инфраструктуре
└── Базы данных (реляционные)
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Базовый пакет для работы с тестами — это testing. Два основных типа здесь —
T
для обычных юнит-тестов и B
для нагрузочных тестов. Тесты в Go пишутся в том же пакете, что и основная программа, с добавлением суффикса _test
. Поэтому любые приватные структуры данных, доступные внутри пакета, доступны и внутри тестов (так же верно, что тесты имеют общую глобальную область видимости между собой. При компиляции основной программы тестовые файлы игнорируются.Помимо базового пакета
testing
, существует большое количество сторонних библиотек, помогающих упростить написание тестов либо позволяющих писать в том или ином стиле (даже в стиле BDD. Вот, например, хорошая вводная статья о том, как писать на Go в стиле TDD.На GitHub есть табличка сравнения тестовых библиотек, среди которых есть такие монстры, как goconvey, предоставляющий ещё и веб-интерфейс, и взаимодействие с системой, например уведомления о прохождении тестов. Чтобы не усложнять, для простых проектов можно использовать небольшую библиотеку testify, добавляющую лишь немного примитивов для проверки условий и создания mock-объектов.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
str := "text some text ${example_text}"
Найти надо подстроку, заключенную в
${ }
. И потом эту подстроку вместе с окружающими символами заменить.В пакете
regexp
есть метод Regexp.ReplaceAllStringFunc
Этот метод заменяет все вхождения строк, удовлетворяющих регулярному выражению, на результат работы функции подстановки. Функция получает на вход подстроку и по ней вычисляет замену.
Можно использовать такое регулярное выражение
// Регулярное выражение для поиска строк вида
// 'начинается с ${, затем любые символы кроме { и }
// в любом количестве, заканчивается }'
re := regexp.MustCompile(`\${[^{}]*}`)
В качестве функции замены предлагаю написать функцию, которая извлекает из найденной подстроки имя переменной и ищет соответствующее значение в таблице переменных
// Таблица значений переменных
varTable := map[string]string{
"some_var": "значение переменной some_var",
"another_var": "значение ещё одной переменной",
}
// Функция замены, подставляет значение переменной из таблицы varTable
substitutor := func(match string) string {
// match - значение вида `${var_name}`
// сначала извлечём var_name
varName := match[2 : len(match)-1]
// Теперь получим значение из таблицы
value, ok := varTable[varName]
if !ok {
// один из вариантов обработки отсутствующего значения - вернуть пустую строку
value = ""
}
return value
}
Обработка строки:
// Заменяем все подстроки, соответствующие регулярному выражению
result := re.ReplaceAllStringFunc(str, substitutor)
очень удобный сайт regex101.com для составления regex, use it
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
https://go.dev/blog/execution-traces-2024
В блоге освещаются несколько ключевых улучшений в трассировке выполнения Go, основанных на пакете runtime/trace.
Вот краткое описание:
- До версии Go 1.21 затраты времени выполнения на трассировку составляли где-то между 10-20% ресурсов процессора для многих приложений, что ограничивает трассировку ситуационным использованием, а не непрерывным, как при профилировании процессора. Сейчас она снизилась до 1-2% для некоторых приложений.
- Фундаментальный способ реализации трассировки был изменен в Go 1.22. Вы можете прочитать об изменениях в проектной документации здесь: https://github.com/golang/proposal/blob/master/design/60773-execution-tracer-overhaul.md
- в /x/exp/trace появилась новая экспериментальная функция, которая позволяет вам отслеживать запросы, которые занимают много времени, чтобы вы могли изучить их позже. Это отличное дополнение, поскольку ранее нам, приходилось включать трассировку и "ждать" выполнения запросов.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Хмм, в Go легковесные потоки даже называются по-другому — горутины, в отличие от корутин в других языках.
Давайте сравним их и обсудим отличия.
Во-первых, сравнивать горутины и корутины - это как сравнивать горячее с высоким. Они предназначены для разных задач и спроектированы по-разному.
co_yield
и co_return
создают значения, co_await
получает значение. В каком-то смысле это старый недобрый setjmp
/longjmp
с поддержкой хранилища локальных переменных от компилятора.yield
, ни await
. Нужно явным образом организовывать передачу данных из горутины через каналы.Я не буду разводить флейм на тему, что лучше - асинхронные алгоритмы с
yield
/wait
или легковесные потоки с каналами. Лично я препочитаю потоки/горутины, потому что мне проще думать в стиле обмена данными между акторами, а не нарезки функциональности на асинхронную лапшу.Вот такие дела ¯\_(ツ)_/¯
#junior
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Пакет Go, который предоставляет функционал для проверки сертификатов
SSL/TLS
на наличие вредоносных подключений.▪Github
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Годное видео, в котором описывается, что же делать с Dependency Injection в Go.
Очень актуально для проектов с большим количеством зависимостей.
Wire — библиотека для разрешения зависимостей в Go.
Работает на основе кодогенерации, а не рефлексии, что плюс к производительности.
Автор объясняет, как инициализировать базу данных через Wire, и как это может помочь избежать ошибок.
Он также обсуждает, как можно возвращать ошибки и деконструкторы.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Цель этой библиотеки - предоставить простой, и беспроблемный способ запуска конвейеров машинного обучения Hugging face в ваших приложениях Go.
▪Github
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Одна из интересных особенностей Go – это использование комментариев для управления компиляцией. Например, вот такая директива:
// +build !amd64
— это "обычный" комментарий в исходном коде, но его читает препроцессор и использует указание
+build
для того, чтобы определить платформу (всё, что не amd64
)Это, конечно, не какой-то там особенный и исключительный случай использования комментариев: вспомните что-нибудь типа
#!/usr/bin/perl
. Тем не менее, ситуация, когда содержание комментария непосредственно влияет на процесс сборки, всё же выглядит необычно.@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Разбираются такие штуки, как:
— Работа с
env
— Нюансы работы с командной строкой
— Работа с указателями
— Структуры
— Использование
defer
— ...и много всего ещё
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM