Это простое приложение для обмена сообщениями, созданное с помощью 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