Собственный формат сериализации
json.Marshaler — то есть MarshalJSON() ([]byte, error) у типа. Это нужно, когда стандартное поведение encoding/json
Пример:
func (t MyTime) MarshalJSON() ([]byte, error) {
// хотим формат "YYYY|MM|DD"
s := t.Format("2006|01|02")
return json.Marshal(s)
}🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥10❤3👍1🥱1
json.MarshalIndent принимает те же данные, что и Marshal, плюс два строковых параметра
prefix и indent, которые управляют только prefix — строка, которая indent — строка для каждого уровня вложенности: например " " или "\t" Во всех случаях
prefix и indent 🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Если внутри
MarshalJSON вызвать json.Marshal на значении того же типа без обёртки, получится Как делать правильно
Нужно маршалить не самого себя, а
MarshalJSON.Пример безопасного варианта:
type User struct {
Name string
}
func (u User) MarshalJSON() ([]byte, error) {
type plain User // alias без методов
return json.Marshal(plain(u))
}🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Порядок полей в JSON формально
Для
struct encoding/json на практике выводит поля в порядке, Для мап порядок ключей в JSON принципиально
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Функция
runtime.GC() принудительно запускает Она полезна для тестирования или в ситуациях, когда нужно
Переменная окружения
GOGC=off полностью отключает GC не запускается сам, память растет без ограничений, что подходит для
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
WANTED: GO-ДОПРОСИТЕЛЬ
Обвиняется в глубоком знании планировщика и умении объяснить работу каналов на пальцах. Пора перестать копить знания в приватных чатах — выходи на большую аудиторию.
Приметы:
— профессионально пишет на
— понимает, что на самом деле спрашивают на интервью в бигтех-компаниях;
— обладает талантом методиста и наставника;
— готов монетизировать свой опыт через создание качественного контента.
Условия:
— статус эксперта в Proglib Academy;
— достойная оплата за участие в проектах;
— мощный PR твоего имени в IT-среде.
Признаться во всём
P.S. Твой техлид — Gopher со стажем? Сдай его следствию.
Обвиняется в глубоком знании планировщика и умении объяснить работу каналов на пальцах. Пора перестать копить знания в приватных чатах — выходи на большую аудиторию.
Приметы:
— профессионально пишет на
Golang (знает, чем он отличается от Java и Python);— понимает, что на самом деле спрашивают на интервью в бигтех-компаниях;
— обладает талантом методиста и наставника;
— готов монетизировать свой опыт через создание качественного контента.
Условия:
— статус эксперта в Proglib Academy;
— достойная оплата за участие в проектах;
— мощный PR твоего имени в IT-среде.
Признаться во всём
P.S. Твой техлид — Gopher со стажем? Сдай его следствию.
debug.SetGCPercent используется для динамической настройки порога запуска сборщика мусора во время
SetGCPercent(-1) полностью отключает автоматическую сборку мусоры, это эквивалентно GOGC=off, память растёт без ограничений.🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
sync.Pool снижает давление на GC,
При
Get() пул возвращает New(). После использования Put() 🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
При попытке маршала канала в 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
❤1👍1
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤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
👍1
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
❤5👏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
🎉1
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
👍4❤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
👾1
По стабильности:
•
•
•
•
По масштабу изменений:
• Major —
• Minor — новая функциональность с
• Patch —
По способу деплоя:
• Canary — выкатка на небольшой процент пользователей
• Blue-green — две идентичные среды, переключение
• Rolling release — постепенное обновление без
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🔥1
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3
Допустим, у вас есть структура со счётчиками, которые обновляют разные горутины:
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