Планировщик Go
runtime.Gosched()
Предположим, у нас есть две горутины:
runtime.Gosched()
,Пример:
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
go func() {
for i := 0; i < 10; i++ {
fmt.Println("Вычисления:", i)
runtime.Gosched() // Подсказка планировщику для переключения
}
}()
go func() {
for i := 0; i < 10; i++ {
fmt.Println("Печать текста:", i)
time.Sleep(10 * time.Millisecond)
}
}()
time.Sleep(1 * time.Second)
}
Горутины
runtime.Gosched()
.runtime.Gosched()
, Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2😢1
Синтаксическая конструкция ‘…’ в Go используется в нескольких контекстах, в частности для:
Синтаксис:
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
Когда вы хотите передать все элементы среза как
Синтаксис:
nums := []int{1, 2, 3, 4}
fmt.Println(sum(nums...)) // Вывод: 10
Когда необходимо создать массив,
x := [...]int{1, 2, 3}// Go определит длину массива автоматически
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤2
package main
import "fmt"
func main() {
x := 10
fmt.Println("Hello, World!")
}
Компилятор выдаст ошибку:
• Однако, если вы присваиваете возвращаемое значение переменной, но не используете эту переменную, компилятор сообщит о проблеме.
package main
import "errors"
func doSomething() (int, error) {
return 42, errors.New("an error occurred")
}
func main() {
doSomething() // Это допустимо
result, err := doSomething() //
}
Это вызовет ошибку, так как
result
и err
не используются• Когда вы импортируете пакет,
package 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)
fmt.Println("Hello, World!")
}
Глобальная переменная
globalVar
не используется,Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Обратный индекс — это
Обратный индекс часто используется в
Пример структуры данных для обратного индекса в Go:
package main
import "fmt"
type InvertedIndex map[string][]int
func addToIndex(index InvertedIndex, term string, docID int) {
index[term] = append(index[term], docID)
}
func main() {
index := make(InvertedIndex)
// Добавление в индекс
addToIndex(index, "hello", 1)
addToIndex(index, "world", 1)
addToIndex(index, "go", 2)
// Печать результата
fmt.Println(index)
}
В этом примере создается обратный индекс, где слово «hello» встречается в документе 1, «world» — в документе 1, а «go» — в документе 2.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥13🥱8❤4
This media is not supported in your browser
VIEW IN TELEGRAM
Добейте 7 бустов, плиз, иначе вопросов с собесов не будет 🚬
Please open Telegram to view this post
VIEW IN TELEGRAM
😢13😁5
Декоратор — это способ
Такой подход часто используют для
Простой пример: логирование вызова метода
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🔥3👍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 used
package 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
👾5👍4❤2🥱1
Когда вы компилируете исходный код в бинарный файл, все данные, включая строки, токены, конфигурации,
Хотя бинарный код
Например, инструменты вроде
Так что
На практике, токены или пароли должны быть хранены в защищённых местах, например:
• В
• В защищённых хранилищах
• Шифрованных
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤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)
}
fmt
net/http
helloHandler
"Hello, World!"
.http.HandleFunc
"/hello"
http.ListenAndServe(":8080", nil)
8080
http.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
😁5❤2
Работа со строками в Go
rune
rune
— это 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
👍10❤2🔥1
Функции, которые могут завершиться с ошибкой, возвращают её как отдельное значение наряду с результатом.
val, err := someFunction()
if err != nil {
// обработка ошибки
}
errors
errors.Is
errors.As
fmt.Errorf(... %w ...)
func DoSomething() error {
if err := someOperation(); err != nil {
return fmt.Errorf("someOperation failed: %w", err)
}
return nil
}
finally
defer
Panic
и recover
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥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
👍6🔥1👏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 shadow
3.
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
👍2🔥1
int8
int16
int
sync.Pool
nil
неиспользуемым структурам.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Примитивы синхронизации — инструменты (в основном из пакета
sync
), которые обеспечивают •
sync.Mutex
— базовый механизм •
sync.RWMutex
— вариант Одновременно могут
Запись возможна
•
sync.WaitGroup
— позволяет •
sync.Once
— гарантирует •
sync.Cond
— условная переменная, при помощи которой Go предлагает два подхода к синхронизации — через
sync
и через Please open Telegram to view this post
VIEW IN TELEGRAM
👍1