debug.SetGCPercent используется для динамической настройки порога запуска сборщика мусора во время
SetGCPercent(-1) полностью отключает автоматическую сборку мусоры, это эквивалентно GOGC=off, память растёт без ограничений.🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
sync.Pool снижает давление на GC,
При
Get() пул возвращает New(). После использования Put() 🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
При попытке маршала канала в JSON
type MyStruct struct {
Ch chan int
}
data, err := json.Marshal(MyStruct{Ch: make(chan int)})
// error: json: unsupported type: chan intФункции
type MyStruct struct {
Fn func(int) string
}
data, err := json.Marshal(MyStruct{Fn: func(i int) string { return "" }})
// error: json: unsupported type: func(int) string🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3🔥3
Dead Letter Queue — это отдельная очередь для обработки сообщений, которые
Как это работает
1. Сообщение попадает в
2. Потребитель пытается его
3. Если обработка
4. После определённого количества неудачных попыток сообщение отправляется в
5. DLQ хранит эти
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
//go:generate — это директива препроцессора, которая указывает инструменту go generate на необходимость выполнить определённую Директива должна находиться в
package main
import "fmt"
//go:generate go run gen.go
//go:generate stringer -type=Status
type Status int
const (
Pending Status = iota
Active
Done
)
func main() {
fmt.Println("Hello")
}
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
netip.Addr — это тип из пакета net/netip, который представляетnet.IP.Основные различия
Тип данных:
// net.IP - это срез байтов
type IP []byte
// netip.Addr - это структура с оптимизацией
type Addr struct {
// Внутренняя реализация с компактным хранением
}
Размер в памяти:
import (
"net"
"net/netip"
)
// net.IP
var ip1 net.IP = net.ParseIP("192.168.1.1")
// Размер: от 4 до 16 байт (срез) + 24 байта (заголовок среза) = ~28-40 байт
// netip.Addr
var ip2 netip.Addr = netip.MustParseAddr("192.168.1.1")
// Размер: 16-17 байт (оптимизирован)
Преимущества netip.Addr
Его можно сравнить, а значит использовать как ключ в мапе:
// net.IP нельзя использовать как ключ в map
var m map[net.IP]string // Ошибка компиляции!
// netip.Addr можно использовать как ключ
var m map[netip.Addr]string // OK
m[netip.MustParseAddr("192.168.1.1")] = "Gateway"
Меньший расход памяти:
// net.IP - неэффективно
ips := make([]net.IP, 1000)
for i := 0; i < 1000; i++ {
ips[i] = net.ParseIP("192.168.1.1")
}
// Высокое потребление памяти из-за срезов
// netip.Addr - эффективно
addrs := make([]netip.Addr, 1000)
for i := 0; i < 1000; i++ {
addrs[i] = netip.MustParseAddr("192.168.1.1")
}
// Компактное хранение
Удобный API:
addr := netip.MustParseAddr("192.168.1.1")
// Методы с хорошим интерфейсом
addr.Is4() // true
addr.Is6() // false
addr.IsPrivate() // true
addr.IsLoopback() // false
addr.IsUnspecified() // false
addr.IsMulticast() // false
addr.Unmap() // Для IPv4-mapped IPv6
addr.String() // "192.168.1.1"
// Работа с префиксами
prefix := netip.MustParseAddrPrefix("192.168.1.0/24")
prefix.Contains(addr) // true🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👏1
При этом можно
// Только для отправки
func send(ch chan<- int) {
ch <- 42
}
// Только для чтения
func receive(ch <-chan int) {
val := <-ch
}
// Двунаправленный
func process(ch chan int) {
ch <- 1
val := <-ch
}
Ограничение направления помогает на этапе
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉3
package main
import _ "unsafe"
//go:linkname nanotime runtime.nanotime
func nanotime() int64
func main() {
println(nanotime())
}
Но использовать
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
Узнать
go tool dist list
Команда выведет все комбинации GOOS/GOARCH, которые поддерживает ваша версия Go.
Пример:
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
freebsd/riscv64
illumos/amd64
ios/amd64
ios/arm64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
linux/loong64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/riscv64
linux/s390x
netbsd/386
netbsd/amd64
netbsd/arm
netbsd/arm64
openbsd/386
openbsd/amd64
openbsd/arm
openbsd/arm64
openbsd/ppc64
openbsd/riscv64
plan9/386
plan9/amd64
plan9/arm
solaris/amd64
wasip1/wasm
windows/386
windows/amd64
windows/arm64
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👾2
По стабильности:
•
•
•
•
По масштабу изменений:
• Major —
• Minor — новая функциональность с
• Patch —
По способу деплоя:
• Canary — выкатка на небольшой процент пользователей
• Blue-green — две идентичные среды, переключение
• Rolling release — постепенное обновление без
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥3
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍5🥱1
Допустим, у вас есть структура со счётчиками, которые обновляют разные горутины:
type Counters struct {
a int64
b int64
c int64
}Каждая горутина работает со своим полем. Конфликтов нет,
Проблема в том, как устроен кеш процессора. CPU не читает
Когда горутина на одном ядре изменяет поле a, процессор инвалидирует эту
Это и есть Cache Contention, или false sharing — ядра
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Отмена в Go всегда течёт
Обратного эффекта нет: отмена
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Использовать пакет
strconv:// Строка → int
num, err := strconv.Atoi("42")
// int → строка
str := strconv.Itoa(42)
// Для других типов:
i64, _ := strconv.ParseInt("42", 10, 64) // string → int64
str64 := strconv.FormatInt(42, 10) // int64 → string
Atoi возвращает
err🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩3
В Go есть пакет
net/http/pprof, который при импорте import (
"net/http"
_ "net/http/pprof" // подчёркивание означает импорт ради side-effect
)
func main() {
// Запускаем профайлер в отдельной горутине на порту 6060
go func() {
http.ListenAndServe(":6060", nil)
}()
// Здесь основная логика приложения...
}
После запуска становятся доступны эндпоинты для анализа:
•
/debug/pprof/profile — нагрузка на процессор•
/debug/pprof/heap — использование памяти•
/debug/pprof/goroutine — состояние горутин•
/debug/pprof/block — блокировки🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7
Функция
len() возвращает размер в Кириллица кодируется в UTF-8
utf8.RuneCountInString().🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤩1
Заголовок слайса занимает
Внутренняя структура слайса выглядит так:
type slice struct {
array unsafe.Pointer // 8 байт — указатель на underlying array
len int // 8 байт — текущая длина
cap int // 8 байт — ёмкость
}24 байта — это только заголовок. Сами данные хранятся
array.Пример расчёта общего размера:
s := make([]int64, 100)
// Заголовок: 24 байта
// Данные: 100 * 8 = 800 байт
// Итого: 824 байта
При передаче слайса в функцию копируется
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
В Go есть правило: канал закрывает только
Паника при записи в закрытый канал — это не баг, а защита от гонок данных. Отправитель точно знает, когда
Но технически читатель закрыть канал может.
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤8🔥6😢2
В таком случае, обычно используется дополнительный канал, называемый каналом управления или сигнальным каналом, который получатель может использовать для отправки сигнала об остановке.
После получения сигнала, отправитель может корректно закрыть основной канал данных:
func main() {
dataCh := make(chan int)
stopCh := make(chan struct{})
go func() {
for {
select {
case data, ok := <-dataCh:
if !ok {
// Канал закрыт, прекращаем обработку
return
}
// Обработка данных
fmt.Println(data)
case <-stopCh:
// Получен сигнал остановки, закрываем канал dataCh
close(dataCh)
return
}
}
}()
// Отправка данных в канал
dataCh <- 1
dataCh <- 2
// Отправка сигнала остановки
stopCh <- struct{}{}
}🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4❤3🤔1