Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментариях.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥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
👍14🤔7👏1
Планировщик Go отвечает за
• G (goroutine)
• M (machine thread)
• P (processor)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9🤔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
👍17
Разработку проекта поддержали 1600 айтишников, а суммарно на запуск было собрано 5 млн. руб. через краудфандинг.
«Всё в одном» для тех, кто ищет работу в IT:
В честь релиза первые 500 пользователей получат скидку 60% на годовой PRO-доступ
🔔 Подпишитесь на Telegram-канал проекта
https://t.me/+UYkjii31QQozZjgy Там появится анонс релиза раньше, чем где-либо ещё. Вы успеете попасть в число первых 500 и получить максимальную выгоду.
Реклама. ИП Кивайко Алексей Викторович, ИНН 532121460552. Erid 2VtzqvmGkoZ
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱1
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👏2🤔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
🔥15👍2❤1
Паттерн Прототип позволяет
В Go этот паттерн может быть реализован через
Чтобы реализовать этот паттерн, мы будем использовать
1. display — для отображения информации о текущем элементе.
2. clone — для создания копии элемента.
Doc1
Doc1_copy
Рекурсивное клонирование — объект является директорией, клонирует не только саму директорию, но и все ее элементы, повторяя этот процесс для каждой вложенной директории и ее элементов.
Суффикс "_copy" — клон получает суффикс "_copy" в своем имени, что позволяет легко отличить оригинальный объект от его копии. (Doc1 → Doc1_copy)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤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
❤7
Чтобы работать с
Передача
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
👍6❤1
Оператор
select
в Go напоминает конструкцию switch
, но предназначен select
select
default
select
выберет один из них случайным образом.Пример
select
select {
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
будет ch1
ch2
ch3
default
Please open Telegram to view this post
VIEW IN TELEGRAM
Указатели — это
Определение и инициализация
Указатель
*
var x *int
int
.Для получения
&
. Например, &y
y
.*
x
y
*x
y
nil
nil
.
pointerToStruct.FieldName
nil
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1🥱1
GOMAXPROCS — это
Как работает
Значение по умолчанию
Изменение GOMAXPROCS
runtime.GOMAXPROCS()
Как это влияет на производительность
Инструмент от Uber — automaxprocs, который автоматически настраивает GOMAXPROCS в соответствии с квотой процессора в Linux-контейнерах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Передача указателей экономит память и улучшает производительность, избегая копирования больших объектов.
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
Указатели позволяют работать с
nil
type 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
👍7❤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
👍10🔥1
В 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
👍7❤4
В Go множество переменных окружения, которые позволяют настраивать поведение инструментов компиляции, сборки и других аспектов работы языка. Эти переменные позволяют разработчикам настраивать рабочее окружение.
GOEXPERIMENTAL
GOARCH
amd64
arm
GOBIN
go install
GOEXE
GOFLAGS
GOOS
linux
darwin
GOPATH
GOPROXY
GOROOT
GOSUMDB
GOTMPDIR
GOVCS
GO111MODULE
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4