Golang Books
16.6K subscribers
280 photos
3 videos
334 files
268 links
Библиотека Golang разработчика

По всем вопросам- @haarrp

@Golang_google - Golang

@golangl - golang chat

@GolangJobsit - golang channel jobs

@golangtests golang tests

@itchannels_telegram - 🔥лучшие ит-каналы

№ 5032829002
Download Telegram
Forwarded from Golang
💥 Необычное поведение структур

В недавнем блоге Мэтта Холла поднята важная деталь, о которой некоторые забывают.

Автор показывает, что при встраивании (`embedding`) структур Go может выбрать неочевидное поле, даже если кажется, что это вызовет ошибку.

Пример:


type FooService struct { URL string }
type BarConnectionOptions struct { URL string }
type BarService struct { BarConnectionOptions }
type Options struct {
FooService
BarService
}

opts := Options{
FooService: FooService{URL: "abc.com"},
BarService: BarService{
BarConnectionOptions: BarConnectionOptions{URL: "xyz.com"},
},
}
fmt.Println(opts.URL)


Вы думаете, тут компиляция не пройдёт из-за неоднозначности?

Но, она завершится успешна — и начпечатает abc.com.

Go выбирает наименее вложенное поле URL, в данном случае FooService.URL.

Урок: будьте осторожны с struct embedding! Переиспользование полей может скрывать баги, особенно когда поля именованы одинаково, а уровни вложенности различны.

📌 Пост

@golang_google

#golang #go
👍11😁43
📚 Кейс: как ВКонтакте переобучила часть команды на Go

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

🔹 Технические вызовы

Перепроектирование архитектуры с учётом PaaS-платформы.

Интеграции с внутренними сервисами.

🔹 Программа переобучения для внутренних сотрудников

140+ инженеров из компании прошли интерактивный курс по переходу на Go

Синтаксис Go изучали самостоятельно — курс сразу начинался с архитектурных и инфраструктурных задач

Практика: проектирование каркаса микросервиса в условиях, максимально приближенных к реальным задачам компании

💡 Вывод: кейс ВКонтакте показывает, как знания о продукте сохраняются внутри компании, почему эффективнее инвестировать в собственников сотрудников, а не распыляться в найме.

#golang #microservices @golang_books
🔥126👍3😁1🤬1
Команда Ozon Tech готовит мощнейший трек по бэкенду в рамках своей конференции E-CODE 💙

И это только одна из причин, почему стоит быть там 13-14 сентября. А ещё: качественный нетворк, 1х1 с топовыми IT-экспертами и HR, эксклюзивный мерч и интерактивы, вечеринки с участием НТР, Заточки, ILWT и Нейромонаха Феофана.

Успейте зарегистрироваться. Это обязательно
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Интересный факт про работу Go

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

https://github.com/golang/go/issues/62024

#golang #programming #reflection
7👍6🥰2🔥1
🧑‍💻 Хотите прокачать знания Go?
Для вас — новый бесплатный курс Академии Selectel

После изучения вы сможете:
▪️запускать fuzzing-тесты,
▪️писать собственный REST API,
▪️разрабатывать gRPC-приложения,
▪️подключать Go к Apache Kafka,
▪️тестировать Kubernetes с помощью Go.

А еще получите подборку дополнительных материалов — книг, подкастов и блогов, которые позволят лучше разобраться в теме.

Начните обучение прямо сейчас:
https://slc.tl/ovswp

Реклама. АО «Селектел», ИНН 7810962785, ERID: 2VtzqwTYVtW
🔥4
Forwarded from Golang
🧠 CasCache — CAS-безопасный кэш для Go с валидацией чтения и «bulk»-наборов

Что это
- Кэш «как CAS»: записи защищены поколениями (generation). Запись проходит только если поколение ключа не изменилось.
- Singles: никогда не вернёт «протухшее» значение; битые/чужого типа записи самовосстанавливаются (самоочистка).
- Bulk: кэширует набор ключей; при чтении каждый элемент сверяется с актуальным поколением — если хоть один устарел, весь набор отбрасывается и читается по одиночке.
- Подключаемые провайдеры значений: Ristretto / BigCache / Redis.
- Подключаемые кодеки: JSON/Msgpack/CBOR/Proto (можно навесить компрессию/шифрование).
- Distributed GenStore (опционально): хранит поколения в Redis для корректности между репликами и переживания рестартов.

Зачем это нужно
- Без «грязных» чтений при гонках читателя/писателя.
- Нулевая «write amplification» при чтении — валидация только на чтении.
- Гибкий выбор провайдера/кодека, можно начать локально и дорастить до кластера (с общим GenStore).

Быстрый старт

import (
"context"
"time"

"github.com/unkn0wn-root/cascache"
rp "github.com/unkn0wn-root/cascache/provider/ristretto"
)

type User struct{ ID, Name string }

func buildCache() cascache.CAS[User] {
rist, _ := rp.New(rp.Config{
NumCounters: 1_000_000,
MaxCost: 64 << 20,
BufferItems: 64,
Metrics: false,
})
cc, _ := cascache.New[User](cascache.Options[User]{
Namespace: "user",
Provider: rist,
Codec: cascache.JSONCodec[User]{},
DefaultTTL: 5 * time.Minute,
BulkTTL: 5 * time.Minute,
// GenStore: nil → локально; для кластера подключите Redis GenStore.
})
return cc
}

func readUser(ctx context.Context, c cascache.CAS[User], id string) (User, bool) {
if u, ok, _ := c.Get(ctx, id); ok { return u, true }
obs := c.SnapshotGen(id) // снять поколение ДО чтения БД
u := loadFromDB(id)
_ = c.SetWithGen(ctx, id, u, obs, 0) // запись пройдёт только если поколение не изменилось
return u, true
}


📌Репозиторий: github.com/unkn0wn-root/cascache
👍4🔥2