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
  В Go множество переменных окружения, которые позволяют настраивать поведение инструментов компиляции, сборки и других аспектов работы языка. Эти переменные позволяют разработчикам настраивать рабочее окружение.
GOEXPERIMENTALGOARCHamd64armGOBINgo installGOEXEGOFLAGSGOOSlinuxdarwinGOPATHGOPROXYGOROOTGOSUMDBGOTMPDIRGOVCSGO111MODULEPlease open Telegram to view this post
    VIEW IN TELEGRAM
  ❤5👾1
  Планировщик 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
  👍7❤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
  👍12❤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
  👍3
  Обратный индекс — это
Обратный индекс часто используется в
Пример структуры данных для обратного индекса в 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
  👍7🔥1
  Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍24🔥14🥱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😁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
  