37.1K subscribers
1.46K photos
34 videos
5 files
1.62K links
加入频道
👣 Существует ли аналог std::endl и std::flush в Go?

Итак, мы все знаем, что в большинстве пользовательских современных ОС стандартный ввод и вывод работает через буфер. Чтобы буфер скинуть в C++ есть std::flush и std::endl, который ещё и переносит на новую строку. Есть ли такое в Go?


Если коротко, то нет, не существует.

Практически все операции вывода в Go используют интерфейсы io.Writer или io.WriteCloser. В этих интерфейсах есть только метод Write. Эти интерфейсы радикально проще стандартного std::basic_stream. Метод Flush или аналоги в io.Writer отсутствуют.

Теперь об объектах std::cin и std::cout. В Go им соответствуют os.Stdin и os.Stdout. Переменная os.Stdout — это указатель на объект типа os.File.

В Go вывод в файлы не буферизуется, метод File.Write пишет напрямую в файловый дескриптор через системный вызов pwrite. Соответственно, в типе File нет метода, аналогичного std::Flush. Есть метод Sync, который вызывает системный вызов fsync для открытого файлового дескриптора, но это не то. Этот системный вызов заставляет ядро сбросить на диск буферы, отведённые под файловый дескриптор.

Из-за того, что File пишет напрямую в файл, функции fmt.Print и fmt.Println, а так же методы File.WriteString и File.Write, очень медленные. На больших объемах вывода они медленнее буферизованного вывода раз в 100.

Буферизованный ввод-вывод предоставляет пакет bufio. В пакете определён тип bufio.Writer, в котором есть метод Flush. Этот тип в десятки раз ускоряет вывод, но, к сожалению, нет типа для буферизованного файла: нельзя написать os.Stdout = bufio.NewWriter(os.Stdout). Поэтому если вам нужен быстрый аналог fmt.Print, то нужно пользоваться fmt.Fprint и явно указывать writer:
Stdout_Buffered := bufio.NewWriter(os.Stdout)
...
fmt.Fprintln(Stdout_Buffered, "Hello, world!")
...
Stdout_Buffered.Flush()

Аналога для std::endl в стандартных пакетах Go нет.

Функция fmt.Fprintln пишет в объект io.Writer системно-зависимый конец строки, но, поскольку io.Writer не содержит никаких аналогов flush, нижележащий буфер (если есть) эта функция не синхронизует.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Где и как применяется gorilla/context?

Итак, вот навскидку несколько областей применения gorilla/context:

Пришел к тебе запрос (может с внешнего сервиса, с браузера или, может, от части твоей же собственной программы, неважно). Была вызвана какая-то функция для обработки, та вызвала еще, та еще, та еще.

И где-то там в глубине нужно принять решение - что ответить на запрос. Или, возможно, пора уже отказаться и оборвать (по таймауту например), или тебя снаружи не захотели столько ждать и связь оборвали и тебе не нужно обрабатывать.

В контекст складывается вся информация, которая нужна для обработки, для принятия решения. Иногда - там же обрывается соединение. Но прежде всего контекст - это куча информации.

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

Где-то в самом низу, в самой глубоко вложенной функции тебе как на блюдечке в контексте лежит куча информации для принятия решения.

Можно это делать и просто прокидыванием переменных внутрь. Но с каждым уровнем число переменным может возростать.

А вообще, применений gorilla/context уйма, можно почитать тут:
📎 Подробнее

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Отличная статья об особенностях Go с массой полезных ссылок

Вот некоторые темы, которые обсуждаются:
— Dependency Injection
— Буферизированный-небуферизированный канал
— Термины, указатели, interface{}
— Множества (sets), кортежи (tuples), функции-генераторы
— Указательные типы данных

Помимо этого обсуждаются алгоритмы, асимптотическая сложность, методы решения задач и всё в таком духе
Пользуйтесь)

📎 Статья

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 skopeo - это утилита командной строки, которая выполняет различные операции с образами контейнеров и их хранилищами.

skopeo не требует запуска демона для выполнения своих операций.

Инструмент может работать как с образами OCI, так и с оригинальными образами Docker v2.

Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Советы по написанию Go кода от Uber

Держите полезные рекомендации по ведению кода на Go.

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

Данное руководство было создано Прашантом Варанаси и Саймоном Ньютоном. С течением времени в него были внесены изменения на основе обратной связи от читателей.

📎 Ссылка

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Укрощение примитивов синхронизации: строим пул потоков на С и Go

Встречайте годный контент)

Эта статья основана на истории об одном личном челлендже. Задача, которая стояла перед инженером, звучала так: помочь с реализацией взаимодействия компонентов в программном комплексе заказчика. Иными словами, понадобилась IPC (Inter-Process Communications, межпроцессное взаимодействие) для дальнейшего развития продукта. Вызов заключался в том, что в обязательных требованиях стояло использование чистого С. Другие языки, включая С++ и Go, не рассматривались.

В итоге Алексей Буреев получил интересный опыт в рамках системного и параллельного программирования. В статье он провел небольшой эксперимент: показал, как можно решить одну задачу с помощью разных языков программирования. Языку С он противопоставил Go, в основе которого есть исторические наработки проектирования языка С. Для этого Алексей заглянул «под капот» стандартных типов данных, которые уже были заботливо созданы разработчиками языка.

📎 Статья

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Tau - Infrastructure's Autopilot
Local Coding Equals Global Production

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

Работа происходит автоматически, в режиме реального времени, это гарантирует постоянную оптимизацию ваших систем без сбоев.

Github
Docs

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Паттерны проектирования с примерами на Go

Полезный контент 🔥
Это коллекция из 22 популярных паттернов проектирования с примерами кода на языке Go и кратким описанием паттерна.

В кратких описаниях будут употребляться классические термины, такие как Класс, Объект, Абстрактный Класс. Применимо к языку Go, это Тип, Значение этого типа и Интерфейс (где это возможно).

Умение правильно использовать шаблоны проектирования, так сказать, в нужном месте и в нужное время, помогут сохранить ваши нервные клетки, используйте эти ссылки

📎 Ссылки на паттерны

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🎊 Выпущены версии 1.22.2 и 1.21.9!

🔐 Безопасность: исправлена ошибка CVE-2023-45288

📢 Анонс: https://groups.google.com/g/golang-announce/c/YgW0sx8mN3M

📦 Скачать: https://go.dev/dl/#go1.22.2

@Golang_google
🔥 Hypert - это библиотека Go с открытым исходным кодом, которая упрощает тестирование клиентов HTTP API.

Она предоставляет удобный способ создания и воспроизведения HTTP запросов, и значительно упрощает создание надежных тестов для ваших клиентов API.

Запись и воспроизведение тестов
Автоматическое удаления конфиденциальной информации
Проверка запросов для обеспечения их целостности
Полная интеграция с GO протоколом http.Client
Легко расширяемые и настраиваемые опции

go get github.com/areknoster/hypert

Github

@Golang_google
Go отлично подходит для работы с большими языковыми моделями и генеративным ИИ.

В этом выпуске "On the Go" показано, как использовать Go для работы с генеративным ИИ с помощью Gemini Pro.

Видео
Nvidia бесплатные обучающие курсы по генеративному ИИ

@Golang_google
👣 go-cfg - Go Configuration Library

Простой и удобный способ инициализировать конфигурацию в структуры, с помощью структурных тегов.

Поддерживаемые форматы:
Переменные окружения
Флаги
Файлы в формате yaml, toml, json, env

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

▪️Github
▪️Docs

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Полностью локально работающий поисковый агрегатор с использованием агентов LLM.

Никаких ключей OpenAI или Google API не требуется.

Серверная часть написана на golang.

Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Дайджест полезных материалов из мира Golang за неделю

Почитать:
Dataloader 3.0: Новый алгоритм для решения проблемы N+1
Выпущены версии 1.22.2 и 1.21.9!
DevOps лучшие бесплатные курсы, книги и ресурсы
Golang: Мои Открытия
Data Flow Analysis для Go 
Миграция баз данных на GO
Beego в Golang для начинающих
Создание серверного Live Chat приложения с использованием Next.js, Fauna и WunderGraph для GraphQL Live Queries
Разбираемся в новом роутинге в Go 1.22
Интервью Роберта Пайка про Go
Огромный список лучших бесплатных курсов Data Science.
Масштабирование подписок GraphQL в Go с использованием Epoll и архитектуры, основанной на событиях
👋 Go "Hello world!" guide
Application Of The Multiple Return Function
Implementing OTel Trace Context Propagation Through Message Brokers with Go
Golang >>> Rust 🔥[Prediction]
Zero cost debug assertions in Go
Real-Time Example: Using Goroutines and Channels
Over 6K Lines Of Code In March, What's The Takeaway?
Simple constant time weighted random choice algorithm
Portr: open-source self-hosted tunnel designed for teams

Проекты

Beego — новая версия высокопроизводительного Go фреймворка для разработки RESTful API, веб-приложений и бэкенд-сервисов, вдохновленный Tornado, Sinatra и Flask.
Паттерны проектирования с примерами на Go
Freeze — полезный Go инструмент для генерации изображений кода и вывода терминала.
Skopeo - это утилита командной строки, которая выполняет различные операции с образами контейнеров и их хранилищами.

Посмотреть:
🌐 Why Golang HTTP Handlers Should Return An Error ( 11:43)
🌐 Golang HTTP Error Handlers & Freestyle Coding To Get Better ( 02:09:24)
🌐 Solving A Golang Job Interview Assignment With Kafka ( 02:24:10)
🌐 1 BILLION ROWS CHALLENGE IN GOLANG ( 02:18:57)
🌐 Пишем рантайм Golang на чистом C | Планировщик Go ( 16:44)

Хорошего дня!

@Golang_google
👣 Как разработать gRCP-сервис на Go

Статья о том, как написать полноценный gRPC-сервис с архитектурой на Go. На примере сервера авторизации.
Попутно идёт знакомство с базовыми подходами к работе с авторизацией, а в конце — настройка автоматического деплоя на сервер с помощью GitHub Actions.

Содержание
• Как правильнее: SSO или Auth?
• Архитектура
• Описание контракта и генерация кода
• Точка входа и конфигурация

📎 Статья

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Go в тулинг! Какие внутренние инструменты мы пишем на Go

Ребята из Lamoda рассказывают, какие инструменты на Go они для себя запилили.

Вот некоторые:
Gonkey — библиотека для проектов на Golang и консольная утилита (для проектов на любых языках и технологиях), с помощью которой можно проводить функциональное и регрессионное тестирование сервисов путем обращения к их API по заранее составленному сценарию. Сценарии тестов описываются в YAML-файлах.

Molekula — инструмент генерации кода для десериализации Aerospike.
Aerospike — это распределённая schema-less key-value база данных, которая работает по принципу хэш-таблицы. Основная её особенность — отсутствие схемы данных. По одному ключу в ней может храниться что угодно, в том числе мапы и списки произвольной вложенности. В итоге в коде много строк и ошибок.

Scratch — инструмент, который позволяет генерировать код для новых сервисов.

📎 Статья
📎Gonkey

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM