ООП
В Go нет классов, но есть структуры (struct), которые выполняют роль классов, и методы, привязанные к этим структурам.
Это позволяет поддерживать принципы инкапсуляции и абстракции, но без классической иерархии наследования.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2😁2
int, float64
0
false
""
nil
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2
Массив — это структура данных
Как его создать:
[capacity]data_type{element_values}
Срез — это
Как его создать:
s := []data_type{element1, element2, ...}
Особенности срезов:
• Для
len()
, для cap()
.• Для добавления
append()
.•
[first_index:second_index]
или s[:]
.• Удаление элементов
append(s[:i], s[i+1:]...)
.•
•
copy()
.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
package
Пакеты позволяют структурировать программу, разделяя её на логические компоненты.
Особенности в пакетах:
package <имя>
import
для доступаПример:
var Pi = 3.14 // экспортируемая
var radius = 5 // неэкспортируемая
• Программы должны
main
main()
fmt
и math/rand
go get
go.mod
_test.go
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5😁4
map
в Go• Создание map
make
m := make(map[string]int)
m["a"] = 1
m["b"] = 2
m := map[string]int{
"a": 1,
"b": 2,
}
• Работа с элементами карты
m["c"] = 3
Получение значения:
value := m["a"]
Проверка наличия ключа:
value, exists := m["b"]
Удаление элемента:
delete(m, "a")
Карты в Go не потокобезопасны.
(sync.Mutex)
sync.Map
var mu sync.Mutex
mu.Lock()
m["a"] = 1
mu.Unlock()
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5👍3
Если попытаться
Когда
panic: interface conversion: <interface type> is <actual type>, not <expected type>
Программа
ok
, чтобы обработатьPlease open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
Однако важно быть внимательным
Основные моменты:
• Сборщик мусора:
• Указатели:
• Циклические ссылки:
Хотя управление памятью автоматическое
• Срезы:
Это динамические массивы
• Стек и куча:
Память делится на стек
• Escape analysis:
Этот механизм анализирует
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🔥3👍1
Интерфейс в Go — это набор методов
type Writer interface {
Write([]byte) (int, error)
}
Тип
Интерфейс без методов называется пустым (
interface{}
Можно комбинировать интерфейсы, например:
type ReadWriter interface {
Reader
Writer
}
Если метод имеет указатель в качестве получателя, он может быть частью интерфейса
Интерфейсы задают требования к поведению типов, что позволяет функциям
Для приведения типов и проверки типа значения интерфейса используют операции
type
assertion
и type switch
.Интерфейс состоит из двух частей: указателя на значение и указателя на таблицу методов этого значения.
Интерфейс может содержать значение
nil
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
defer
Когда встречается
defer
Применения defer:
defer
file, err := os.Open("file.txt")
if err != nil {
// обработка ошибки
}
defer file.Close()
defer
func example() {
defer fmt.Println("1")
defer fmt.Println("2")
fmt.Println("Function body")
}
defer
defer
func example(a int) {
defer fmt.Println(a)
a *= 2
return
}
example(5) // Выведет: 5
defer
recover()
func mightPanic() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
// код, который может вызвать панику
}
defer
defer
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉8👍6🥱3❤2
🤯 Мы больше года строим мультиагентные системы
Грабли, находки, паттерны, эксперименты — всё это накопилось и в какой-то момент стало жалко держать только у себя.
Никита — рассказывает (и показывает) базу: токенизация, LLM, SFT, PEFT, локальный инференс + RAG и как оценивать его качество.
Диана — как строят мультиагентные системы, какие есть паттерны проектирования и библиотеки.
Макс — про инференс в проде + разберет CoPilot, соберет с вами из кусочков свой копайлот, а затем его сломает через prompt injection. // Макс фанат autogen (а если нет — он вас разубедит в своем классном канале)
Финальным аккордом Дима углубится в MCP и соберет несколько кейсов повзрослее.
Курс тут: https://clc.to/47pgYA
Промокод:datarascals действует до 23:59 29 июня
Грабли, находки, паттерны, эксперименты — всё это накопилось и в какой-то момент стало жалко держать только у себя.
Никита — рассказывает (и показывает) базу: токенизация, LLM, SFT, PEFT, локальный инференс + RAG и как оценивать его качество.
Диана — как строят мультиагентные системы, какие есть паттерны проектирования и библиотеки.
Макс — про инференс в проде + разберет CoPilot, соберет с вами из кусочков свой копайлот, а затем его сломает через prompt injection. // Макс фанат autogen (а если нет — он вас разубедит в своем классном канале)
Финальным аккордом Дима углубится в MCP и соберет несколько кейсов повзрослее.
Курс тут: https://clc.to/47pgYA
Промокод:
new
make
new
p := new(int)
p
int
make
• Срезы: при создании среза с помощью
make
s := make([]int, 5, 10)
make
m := make(map[string]int)
• Каналы:
make
ch := make(chan int)
Основные различия между
make
new
new
make
make
. new
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1
type Engine struct {
Power int
Type string
}
type Car struct {
Engine
Brand string
Model string
}
func main() {
c := Car{
Engine: Engine{Power: 150, Type: "Petrol"},
Brand: "Ford",
Model: "Fiesta",
}
fmt.Println(c.Power) // Выведет: 150
}
type Writer interface {
Write([]byte) (int, error)
}
type Logger struct {
Writer
}
Logger
Writer
Writer
Важные моменты:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍5😁1
slices.Contains(s, v)
— slices.Sort(s)
— slices.Max(s)
— slices.Delete(letters, 1, 4)
— slices.Compare(a, b)
— slices.Compact
: slices.Clip
: slices.Clone
: BinarySearch
: Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤6👏1
Потоки — это низкоуровневые объекты операционной системы, предназначенные для параллельного выполнения задач.
Горутины начинают с небольшого стека
Потоки обычно имеют фиксированный размер стека, который значительно больше, часто от 1 МБ и выше.
Горутины создаются с помощью ключевого слова go перед вызовом функции и требуют минимальных затрат на создание и переключение контекста.
Потоки стоят дороже как по времени создания, так и по затратам на переключение контекста, поскольку для этого необходимо взаимодействовать с операционной системой.
Горутины управляются планировщиком Go, работающим в пользовательском пространстве, который распределяет горутины по доступным потокам ОС
Ошибка в одной горутине
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
arr1 := [5]int{}
arr2 := [...]int{1, 2, 3}
arr3 := [...]int{}
arr1 := [5]int{}
— 0
int
это значение arr2 := [...]int{1, 2, 3}
— А вот
arr3 := [...]int{}
arr3 := [0]int{}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥3❤1⚡1
🔥 Последняя неделя перед стартом курса по AI-агентам
Старт курса уже 5го числа! Если вы планировали вписаться — сейчас ПОСЛЕДНИЙ шанс забронировать место
На курсе:
— разложим LLM по косточкам: токенизация, SFT, PEFT, инференс
— соберём RAG и научимся оценивать его адекватно
— построим настоящую мультиагентную систему — архитектуру, которая умеет расти
— разберём CoPilot, сломаем через prompt injection (спасибо Максу)
— и наконец, посмотрим, как это работает в MCP и реальных кейсах
📍 Это 5 живых вебинаров + раздатка + домашки + чат с преподавателями
И главное — возможность реально разобраться, как проектировать системы на LLM, а не просто «поиграться с API»
👉 Курс здесь
Старт курса уже 5го числа! Если вы планировали вписаться — сейчас ПОСЛЕДНИЙ шанс забронировать место
На курсе:
— разложим LLM по косточкам: токенизация, SFT, PEFT, инференс
— соберём RAG и научимся оценивать его адекватно
— построим настоящую мультиагентную систему — архитектуру, которая умеет расти
— разберём CoPilot, сломаем через prompt injection (спасибо Максу)
— и наконец, посмотрим, как это работает в MCP и реальных кейсах
📍 Это 5 живых вебинаров + раздатка + домашки + чат с преподавателями
И главное — возможность реально разобраться, как проектировать системы на LLM, а не просто «поиграться с API»
👉 Курс здесь
• Избегание дублирования состояния в памяти
• Работа в многопоточной среде и потокобезопасный доступ к общей структуре
• Затрудняет тестирование (невозможно подменить зависимости)
• Провоцирует на глобальные сингл-точки сбоя (если объект упал — всё развалилось)
• Препятствует масштабируемости при переходе к микросервисной архитектуре
private
sync
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🌚2👏1
context.Background()
или context.TODO()
Когда вы работаете с Go-контекстами, легко запутаться: оба выглядят одинаково, оба ничего не делают — но используются по-разному.
context.Background()
main()
context.TODO()
Такой контекст часто используется в
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱3❤2
sync.Mutex
Рабочий
package main
import (
"fmt"
"sync"
)
type singleton struct {
data string
}
var (
instance *singleton
mu sync.Mutex
)
func GetInstance() *singleton {
if instance == nil {
mu.Lock()
defer mu.Unlock()
if instance == nil {
instance = &singleton{data: "initialized"}
}
}
return instance
}
func main() {
s := GetInstance()
fmt.Println("Singleton data:", s.data)
}
if instance == nil
mu.Lock()
sync.Once
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👏1
context
в Go вы знаетеctx := context.Background()
ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
defer cancel()
• WithCancel
• WithTimeout
• WithDeadline
• WithValue
Каждая из этих функций создаёт дочерний контекст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🥱1
sync.Once
, если уже есть мьютексыЕсли вы хотите
sync.Once
package main
import (
"fmt"
"sync"
)
type singleton struct {
config string
}
var (
once sync.Once
instance *singleton
)
func GetInstance() *singleton {
once.Do(func() {
instance = &singleton{config: "default"}
})
return instance
}
func main() {
s := GetInstance()
fmt.Println("Singleton config:", s.config)
}
sync.Once
GetInstance
вызывается из Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2