This media is not supported in your browser
VIEW IN TELEGRAM
Добейте 7 бустов, плиз, иначе вопросов с собесов не будет 🚬
Please open Telegram to view this post
VIEW IN TELEGRAM
😢13😁6
Декоратор — это способ
Такой подход часто используют для
Простой пример: логирование вызова метода
type Handler interface {
Handle(msg string) string
}
type SimpleHandler struct{}
func (h SimpleHandler) Handle(msg string) string {
return "Handled: " + msg
}Теперь сделаем обёртку:
type LoggingHandler struct {
next Handler
}
func (l LoggingHandler) Handle(msg string) string {
fmt.Println("Запрос:", msg)
result := l.next.Handle(msg)
fmt.Println("Ответ:", result)
return result
}Использование:
func main() {
base := SimpleHandler{}
withLog := LoggingHandler{next: base}
fmt.Println(withLog.Handle("тест"))
}Please open Telegram to view this post
VIEW IN TELEGRAM
1❤7🔥4👍2
Существует правило, по которому код не скомпилируется,
package main
import "fmt"
func main() {
x := 10
fmt.Println("Hello, World!")
}
Компилятор выдаст ошибку:
x declared but not usedОднако если значения
package main
import "errors"
func doSomething() (int, error) {
return 42, errors.New("an error occurred")
}
func main() {
doSomething() // Это допустимо
result, err := doSomething() // Ошибка, так как result и err не используются
}
"math" imported and not usedpackage main
import "math" // Ошибка, импорт не используется
func main() {
// Ничего не делаем
}
❕Правило
package main
import "fmt"
var globalVar int // Глобальная переменная, которая не используется
func greet(name string, age int) { // Параметры функции также могут не использоваться
fmt.Println("Hello,", name)
}
func main() {
greet("Alice", 25) // Параметры функции 'name' и 'age' не используются
fmt.Println("Hello, World!")
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👾6👍4❤2🥱1
Когда вы компилируете исходный код в бинарный файл, все данные, включая строки, токены, конфигурации,
Хотя бинарный код
Например, инструменты вроде
Так что
На практике, токены или пароли должны быть хранены в защищённых местах, например:
• В
• В защищённых хранилищах
• Шифрованных
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2
Базовый пример:
package main
import (
"fmt"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func main() {
http.HandleFunc("/hello", helloHandler)
http.ListenAndServe(":8080", nil)
}
fmtnet/httphelloHandler "Hello, World!".http.HandleFunc"/hello"http.ListenAndServe(":8080", nil)8080http.FileServer:package main
import "net/http"
func main() {
port := ":8080"
handler := http.FileServer(http.Dir("."))
http.ListenAndServe(port, handler)
}
Аналог
python -m http.server — Please open Telegram to view this post
VIEW IN TELEGRAM
😁6❤2
Работа со строками в Go
runerune — это int32, предназначенный для При переборе строки с помощью конструкции
for range, rune.Примеры:
•
var r rune = 'A'
•
s := "Привет"
runes := []rune(s)
•
for _, r := range "Привет" {
fmt.Printf("%c ", r)
}
// Вывод: П р и в е т •
runes := []rune{'П', 'р', 'и', 'в', 'е', 'т'}
s := string(runes) // "Привет"•
r := 'A'
code := int32(r) // 65
•
s := "Привет"
length := utf8.RuneCountInString(s) // 6
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤2🔥1
Функции, которые могут завершиться с ошибкой, возвращают её как отдельное значение наряду с результатом.
val, err := someFunction()
if err != nil {
// обработка ошибки
}
errorserrors.Iserrors.Asfmt.Errorf(... %w ...)func DoSomething() error {
if err := someOperation(); err != nil {
return fmt.Errorf("someOperation failed: %w", err)
}
return nil
}finally deferPanic и recover Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3🔥1
Mutex (mutual exclusion — взаимное исключение)
Критическая секция — участок кода, где
sync.Mutex — Только
var mu sync.Mutex
func increment() {
mu.Lock()
count++
mu.Unlock()
}
Здесь мы рассматриваем
count при sync.RWMutex — Позволяет:
var mu sync.RWMutex
func set(key, value string) {
mu.Lock()
cache[key] = value
mu.Unlock()
}
func get(key string) string {
mu.RLock()
defer mu.RUnlock()
return cache[key]
}
Дает
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👏2🔥1
package main
import (
"fmt"
)
func main() {
x := 10
if true {
x := 5 // затенение внешней переменной x
fmt.Println(x) // выводит 5
}
fmt.Println(x) // выводит 10
}
err. Пример часто встречающегося кода в Go:value, err := someFunction()
if err != nil {
// обработка ошибки
}
// ...
value2, err := anotherFunction() // новое затенение переменной err
if err != nil {
// обработка ошибки
}
Если использовать
:= =, вы создадите err, которая «затенит» переменную err из❕
1.
go vet -shadow ./...2.
golangci-lint run --enable shadow3.
shadow:$ go get -u golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
$ go vet -vettool=$(which shadow)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
int8int16intsync.Pool nil неиспользуемым структурам.Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1🔥1
Примитивы синхронизации — инструменты (в основном из пакета
sync), которые обеспечивают •
sync.Mutex — базовый механизм •
sync.RWMutex — вариант Одновременно могут
Запись возможна
•
sync.WaitGroup — позволяет •
sync.Once — гарантирует •
sync.Cond — условная переменная, при помощи которой Go предлагает два подхода к синхронизации — через
sync и через Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2
🚀 Главная ошибка новичка в ML — строить звездолёт вместо велосипеда
Многие сразу хотят свою Midjourney, но в итоге получают только выгорание.
Успех начинается с «велосипеда»: научитесь предсказывать цены или классифицировать отзывы. Освойте базу, а уже потом стройте «звездолёты».
Наш курс «ML для старта в Data Science» — это и есть тот самый правильный старт от простого к сложному.
👉 Начните правильно
Берёте курс «ML для старта» до конца недели — Python в подарок.
❗А 21 августа пройдет бесплатный вебинар с Марией Жаровой: узнаете, какие проекты качают скилл, а какие качают ваши нервы.
А какой самый сложный проект вы брались делать в самом начале? 🫢
Многие сразу хотят свою Midjourney, но в итоге получают только выгорание.
Успех начинается с «велосипеда»: научитесь предсказывать цены или классифицировать отзывы. Освойте базу, а уже потом стройте «звездолёты».
Наш курс «ML для старта в Data Science» — это и есть тот самый правильный старт от простого к сложному.
👉 Начните правильно
Берёте курс «ML для старта» до конца недели — Python в подарок.
❗А 21 августа пройдет бесплатный вебинар с Марией Жаровой: узнаете, какие проекты качают скилл, а какие качают ваши нервы.
А какой самый сложный проект вы брались делать в самом начале? 🫢
❤1
Пример
func main() {
c := make(chan bool)
m := make(map[string]string)
go func() {
m["1"] = "a" // Первый конфликтный доступ
c <- true
}()
m["2"] = "b" // Второй конфликтный доступ
<-c
for k, v := range m {
fmt.Println(k, v)
}
}-race$ go test -race mypkg
$ go run -race mysrc.go
$ go build -race mycmd
$ go install -race mypkg
GORACE позволяет $ GORACE="log_path=/tmp/race/report Strip_path_prefix=/my/go/sources/" go test -race
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Пустой идентификатор
_ в Go используется как value, _ := someFunction()
range: при переборе for k, _ := range myMap {
fmt.Println(k)
}
for _, v := range mySlice {
fmt.Println(v)
}import _ "image/png"
_, y := getCoordinates()
result, _ := strconv.Atoi("123")person := struct {
Name string
_ int
}{"Alice", 30}Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2
• Анонимные функции в Go
• В Go есть возможность доступа к
Пример с функцией
incrementer, которая создает i:func incrementer() func() int {
i := 0
return func() int {
i++
return i
}
}При вызове
incrementeri, и incrementer i.func main() {
increment := incrementer()
fmt.Println(increment()) // 1
fmt.Println(increment()) // 2
fmt.Println(increment()) // 3
newIncrement := incrementer()
fmt.Println(newIncrement()) // 1
}Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2
Оператор
switch в Go позволяет проверять тип switch включает хотя быcase, который работает default, который выполняется, Пример, который проверяет,
i типом int или string:func do(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("Double %v is %v\n", v, v*2)
case string:
fmt.Printf("%q is %v bytes long\n", v, len(v))
default:
fmt.Printf("I don't know type %T!\n", v)
}
}
func main() {
do(21)
do("hello")
do(true)
}Результат:
Double 21 is 42
"hello" is 5 bytes long
I don't know type bool!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1🥱1
Стек — тип данных, основанный на принципе
Элементы стека связаны
Элемент, помещённый в
Операции:
pop — удаление верхнего элемента,
peek — возврат верхнего элемента без удаления.
Реализация на Go через срез:
type Stack struct {
items []int
}
func (s *Stack) Push(item int) {
s.items = append(s.items, item)
}
func (s *Stack) Pop() int {
if len(s.items) == 0 {
panic("Stack is empty!")
}
item := s.items[len(s.items)-1]
s.items = s.items[:len(s.items)-1]
return item
}
func (s *Stack) Peek() int {
if len(s.items) == 0 {
panic("Stack is empty!")
}
return s.items[len(s.items)-1]
}
func (s *Stack) IsEmpty() bool {
return len(s.items) == 0
}
func (s *Stack) Size() int {
return len(s.items)
}Мы использовали
Push Pop Peek позволяет посмотреть Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🔥 Последняя неделя, чтобы забрать курс по AI-агентам по старой цене!
Пока вы тестируете Copilot, другие уже учатся строить AI-агентов, которые реально работают на бизнес. Хватит отставать!
Наш курс — это концентрат практики по LangChain и RAG. Улучшенная версия, доработанная по отзывам первого потока.
📆 Старт — 15 сентября.
💸 Цена 49 000 ₽ — только до 24 августа.
👉 Зафиксировать цену
Пока вы тестируете Copilot, другие уже учатся строить AI-агентов, которые реально работают на бизнес. Хватит отставать!
Наш курс — это концентрат практики по LangChain и RAG. Улучшенная версия, доработанная по отзывам первого потока.
📆 Старт — 15 сентября.
💸 Цена 49 000 ₽ — только до 24 августа.
👉 Зафиксировать цену
❤2
a := 5
b := 3
a = a + b // a становится 8
b = a - b // b становится 5
a = a - b // a становится 3
a и b меняются a := 5 // 0101 в двоичной системе
b := 3 // 0011 в двоичной системе
a = a ^ b // a становится 6 (0110)
b = a ^ b // b становится 5 (0101)
a = a ^ b // a становится 3 (0011)
func main() {
fmt.Println(swap())
}
func swap() []int {
a, b := 15, 10
b, a = a, b
return []int{a, b}
}swap a и b местами и возвращает Please open Telegram to view this post
VIEW IN TELEGRAM
😁11
⚡️ Бесплатный вебинар — прогнозируем цены и не сходим с ума
21 августа в 19:00 МСК будет бесплатный вебинар с Марией Жаровой — экспертом в ML и Data Science.
Тема:
Подробности рассказываю в гс выше — включай, чтобы не пропустить.
21 августа в 19:00 МСК будет бесплатный вебинар с Марией Жаровой — экспертом в ML и Data Science.
Тема:
«Введение в машинное обучение: как спрогнозировать стоимость недвижимости».
Подробности рассказываю в гс выше — включай, чтобы не пропустить.
Cgo создаёт
Cвойства cgo:
• Встраивание
import "C"• Доступ к именам из заголовков и
C• Преобразования типов выполняются явно при переходе
C.* к • Память: объекты,
C.free, длительное хранение указателей на Go-память в package randc
/*
#include <stdlib.h>
*/
import "C"
func Random() int {
return int(C.random()) // C.long -> Go int
}
func Seed(i uint) {
C.srandom(C.uint(i)) // Go uint -> C unsigned int
}
Разбор примера:
•
import "C" — • В
rand C.random и C.srandom, C.uint(i) и сам •
Random вызывает random из libc. В C long (C.long в cgo), int перед •
Seed принимает Go int, приводит к C.uint и передаёт в srandom.• Комментарий непосредственно перед
import "C" — C.*.Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2