Singleton может мешать тестированию
type Storage interface {
    Get(key string) string
}func ProcessData(s Storage) { ... }// В тестовых сборках
func resetSingleton() {
instance = nil
once = sync.Once{}
}
❕Warning
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍4🤔1
  select выбирает случайноОдно из важных свойств
select в Go select {
case msg := <-ch1:
    fmt.Println("ch1:", msg)
case msg := <-ch2:
    fmt.Println("ch2:", msg)
}Если и
ch1, и ch2 доступны Это исключает жёсткий приоритет каналов
Это нужно для предотвращения "голодания"
Please open Telegram to view this post
    VIEW IN TELEGRAM
  😁10👍3🌚2
  Отношение happens-before гарантирует
Please open Telegram to view this post
    VIEW IN TELEGRAM
  😁3👏1🎉1
  Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментариях.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍27🔥12😢7❤5👾1
  Redis поддерживает два механизма сохранения данных:
Эти два метода
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍6🔥4
  sync/atomicАтомарная операция
Store Load той же переменной Инициализация
main(), что Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍1
  Паттерн «Функциональные опции»
Этот подход идеален,
Пример
type Server struct {
    host     string
    port     int
    protocol string
}
func NewServer(host string, port int) *Server {
    return &Server{host: host, port: port, protocol: "http"}
}Реализация функциональных опций
type ServerOption func(*Server)
func WithPort(port int) ServerOption {
    return func(s *Server) {
        s.port = port
    }
}NewServer:func NewServer(host string, opts ...ServerOption) *Server {
    server := &Server{host: host, port: 443, protocol: "https"}
    for _, opt := range opts {
        opt(server)
    }
    return server
}Теперь можно
server1 := NewServer("localhost")               // с портом по умолчанию
server2 := NewServer("localhost", WithPort(8080)) // с портом 8080Этот подход позволяет добавлять параметры
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍15🤔7👏1🌚1
  Планировщик Go отвечает за
• G (goroutine)
• M (machine thread)
• P (processor)
Please open Telegram to view this post
    VIEW IN TELEGRAM
  🔥11🤔2
  Дженерики в Go — это механизм, введенный в версии 1.18
Дженерики позволяют
• Уменьшение
• Повышенная
• Увеличение
До введения дженериков, разработчики использовали интерфейсы и преобразование типов для обеспечения гибкости.
func MinInts(arr []int) int { /*...*/ }
func MinFloats(arr []float64) float64 { /*...*/ }Теперь с использованием дженериков можно создать
func Min[T comparable](arr []T) T { /*...*/ }Здесь
 T — это comparable указывает,Без дженериков:
type Queue struct {
    data []interface{}
}Использование
interface{} требует С дженериками:
type Queue[T any] struct {
    data []T
}Здесь
T может быть Внедрение дженериков в Go получило положительный отклик
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍18
  Escape analysis — это техника
В Go
Компилятор
Если же переменная «выходит» — например,
func sum(a, b int) int {
    result := a + b 
    return result
}В данном случае переменная
result func newInt() *int {
    result := 42 
    return &result
}Здесь переменная
result выходит за пределы var globalVar *int
func setGlobalVar() {
x := 100
globalVar = &x
}
Переменная
x Escape analysis помогает управлять
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍9👏3🤔1
  🔥 Вы ещё можете застать старый добрый Proglib — с вечным доступом к курсам.
С 1 августа всё меняется: навсегда — останутся только те, кто успел купить сейчас.
-40% на все курсы. Включая обновлённый Python (кроме курса по AI-агентам)
Это не просто распродажа. Это — последняя точка входа в Proglib Academy по старым правилам.
📚 Выбрать и забрать свой курс навсегда → https://clc.to/TBtqYA
  С 1 августа всё меняется: навсегда — останутся только те, кто успел купить сейчас.
-40% на все курсы. Включая обновлённый Python (кроме курса по AI-агентам)
Это не просто распродажа. Это — последняя точка входа в Proglib Academy по старым правилам.
📚 Выбрать и забрать свой курс навсегда → https://clc.to/TBtqYA
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  🔥18👍2❤1
  Паттерн Прототип позволяет
В Go этот паттерн может быть реализован через
Чтобы реализовать этот паттерн, мы будем использовать
1. display — для отображения информации о текущем элементе.
2. clone — для создания копии элемента.
Doc1Doc1_copyРекурсивное клонирование — объект является директорией, клонирует не только саму директорию, но и все ее элементы, повторяя этот процесс для каждой вложенной директории и ее элементов.
Суффикс "_copy" — клон получает суффикс "_copy" в своем имени, что позволяет легко отличить оригинальный объект от его копии. (Doc1 → Doc1_copy)
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍8❤3🤩2
  Inlining — это
func add(a, b int) int {
    return a + b
}
func main() {
    result := add(3, 4)
    fmt.Println(result)
}func main() {
    result := 3 + 4
    fmt.Println(result)
}Основные моменты:
-gcflags="-m"Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤8👏1
  Чтобы работать с
Передача
func modifyValue(x int) {
    x = x * 2
}
func main() {
    num := 10
    modifyValue(num)
    fmt.Println(num) // 10
}В примере
numПередача
Срезы и мапы передаются
func modifySlice(s []int) {
    s[0] = 100
}
func main() {
    numbers := []int{1, 2, 3}
    modifySlice(numbers)
    fmt.Println(numbers) // [100 2 3]
}Передача
func modifyWithPointer(x *int) {
    *x = *x * 2
}
func main() {
    num := 10
    modifyWithPointer(&num)
    fmt.Println(num) // 20
}Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍7❤2
  Оператор
select в Go напоминает конструкцию switch, но предназначен selectselectdefaultselect выберет один из них случайным образом.Пример
selectselect {
case msg1 := <-ch1:
    fmt.Println("Received", msg1)
case msg2 := <-ch2:
    fmt.Println("Received", msg2)
case ch3 <- 3:
    fmt.Println("Sent 3 to ch3")
default:
    fmt.Println("No communication")
}В этом примере
select будет ch1ch2ch3defaultPlease open Telegram to view this post
    VIEW IN TELEGRAM
  🎉1
  Указатели — это
Определение и инициализация
Указатель
*var x *int int.Для получения
&. Например, &y y.*xy*xynilnil . pointerToStruct.FieldNamenilPlease open Telegram to view this post
    VIEW IN TELEGRAM
  👍9❤3🔥1🥱1
  GOMAXPROCS — это
Как работает
Значение по умолчанию
Изменение GOMAXPROCS
runtime.GOMAXPROCS()Как это влияет на производительность
Инструмент от Uber — automaxprocs, который автоматически настраивает GOMAXPROCS в соответствии с квотой процессора в Linux-контейнерах.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍3
  Передача указателей экономит память и улучшает производительность, избегая копирования больших объектов.
type LargeStruct struct {
    Field1 [1000]int
    Field2 [1000]int
}
func modify(s *LargeStruct) {
    s.Field1[0] = 42
}
func main() {
    ls := LargeStruct{}
    modify(&ls) // Передаем указатель, избегая копирования
}Для изменения значения переменной в функции и отражения этих изменений за пределами функции необходимо использовать указатель.
func increment(x *int) {
    *x++
}
func main() {
    num := 10
    increment(&num) // Изменение переменной через указатель
    fmt.Println(num) // 11
}nilУказатели позволяют работать с
niltype User struct {
    Name string
}
func createUser() *User {
    return nil // Возвращаем nil, если пользователь не найден
}
func main() {
    user := createUser()
    if user == nil {
        fmt.Println("User not found")
    }
}Указатели необходимы для работы с системными ресурсами или низкоуровневыми API, такими как через
cgo/*
#include <stdlib.h>
void modify(int *x) {
*x = 42;
}
*/
import "C"
func main() {
var num int
C.modify((*C.int)(&num)) // Используем указатель для передачи в C-функцию
fmt.Println(num) // 42
}
Указатели удобны для совместного использования данных в горутинах, но требуют синхронизации для предотвращения гонок.
func incrementCounter(counter *int) {
    *counter++
}
func main() {
    counter := 0
    go incrementCounter(&counter)
    fmt.Println(counter) // Возможно увеличение
}Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍8❤1
  В стандартной библиотеке Go целый набор мощных инструментов, которые делают процесс разработки проще и удобнее. Эти инструменты помогают разработчикам работать с исходным кодом, проводить тестирование, управлять зависимостями и многое другое.
go fmt — go get — go test — go build — go run — go doc — go vet — go mod — Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍13🔥2
  В Go сборщик мусора (GC) автоматически управляет памятью, но бывают ситуации, когда нужно вмешаться и настроить его работу под свои нужды.
Принудительный запуск GC
Хотя сборщик мусора обычно работает автоматически, мы можем вручную запустить его с помощью функции
runtime.GC()Отключение и включение GC
Можно временно отключить сборщик мусора, установив
debug.SetGCPercent(-1)debug.SetGCPercent(100)GOGC = 100 (значение по умолчанию) означает, что сборка мусора произойдет, когда объем выделенной памяти увеличится на 100% по сравнению с предыдущей сборкой.
GOGC = 50 ускоряет сборку мусора, позволяя ей запускаться чаще — после 50% увеличения памяти.
GOGC = -1 отключает сборщик мусора.
GOGC = 50 ./your-program
Или изменить его внутри программы с помощью
debug.SetGCPercent()❕Важно помнить
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍10❤4
  