Telegram Group Search
Что возвращает метод bytes.SplitN и чем он отличается от bytes.Split

Метод bytes.SplitN возвращает срез подмассивов (срезов байт), которые являются результатом разделения исходного среза байт на части, используя заданный разделитель. Главное отличие от bytes.Split заключается в том, что SplitN ограничивает количество частей, которые будут возвращены. Второй параметр n указывает максимальное количество частей, а если значение n равно 1, метод просто возвращает исходный срез без изменений. Если n больше, чем фактическое количество частей, то метод SplitN вернет все возможные части.

bytes.Split, в свою очередь, не имеет ограничения на количество частей, он возвращает все возможные разбиения исходного среза, и будет продолжать разделение до тех пор, пока не обработает весь срез.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
😡 А вас тоже бесят облачные сервисы?

Согласитесь, статус отношений с облаками — все сложно. Но что, если можно изменить правила игры?

Мы готовим нечто особенное в мире облачных технологий, но сначала хотим услышать правду от тех, кто реально работает с облаками каждый день.

Что мы хотим узнать:
— Для чего вы реально используете облако?
— Чего катастрофически не хватает прямо сейчас?
— Что бесит больше всего? (можно материться)
— Как выбираете провайдера — по цене или по любви?
— и тому подобное

По результатам опроса мы подготовим исследование без маркетингового мусора и вы узнаете, как обстоят дела у коллег.

⚡️Время на опрос: меньше, чем на кофе-брейк. Жмите → https://clc.to/nboYDA
Какие инструменты для фаззинг-тестирования поддерживает Go

Go предоставляет встроенную поддержку фаззинг-тестирования с версии Go 1.18. Для этого в Go используется пакет testing, который теперь включает в себя поддержку фаззинга через встроенную функцию Fuzz

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Зачем может понадобиться паттерн функциональных опций

Функциональные опции позволяют гибко конфигурировать объект, не перегружая конструктор множеством параметров. Вместо длинной сигнатуры New() с десятком аргументов — часть параметров выносится в функции-опции.

Это упрощает читаемость, делает код масштабируемым и помогает не раскрывать внутренние поля структуры. Особенно полезно, когда появляются новые настройки — не нужно менять сигнатуру, достаточно добавить новую опцию.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
❗️ Пример для предыдущего вопроса

У нас есть структура ServerConfig. Она хранит все настройки сервера: хост, порт, флаг использования TLS и таймаут.

В функции NewServer мы принимаем срез функций типа Option, который позволяет нам гибко настраивать сервер.

Каждая опция — это просто функция. Причём она не меняет сервер напрямую, а принимает на вход его конфигурацию и меняет только нужное поле.

import "fmt"

// Конфигурация структуры
type ServerConfig struct {
Host string
Port int
UseTLS bool
Timeout int
}

// Тип функции, которая изменяет настройки конфигурации
type Option func(*ServerConfig)

// Новый сервер с конфигурацией по умолчанию
func NewServer(options ...Option) *ServerConfig {
// Настройки по умолчанию
config := &ServerConfig{
Host: "localhost",
Port: 8080,
UseTLS: false,
Timeout: 30,
}

// Применение всех переданных опций
for _, option := range options {
option(config)
}

return config
}

// Опция для изменения хоста
func WithHost(host string) Option {
return func(c *ServerConfig) {
c.Host = host
}
}

// Опция для изменения порта
func WithPort(port int) Option {
return func(c *ServerConfig) {
c.Port = port
}
}

// Опция для включения TLS
func WithTLS(enable bool) Option {
return func(c *ServerConfig) {
c.UseTLS = enable
}
}

// Опция для изменения таймаута
func WithTimeout(timeout int) Option {
return func(c *ServerConfig) {
c.Timeout = timeout
}
}

func main() {
// Создаем сервер с настройками по умолчанию
server := NewServer()

// Печатаем настройки сервера
fmt.Printf("Default server config: %+v\n", server)

// Создаем сервер с измененными настройками
customServer := NewServer(
WithHost("example.com"),
WithPort(9090),
WithTLS(true),
WithTimeout(60),
)

// Печатаем новые настройки сервера
fmt.Printf("Custom server config: %+v\n", customServer)
}
Please open Telegram to view this post
VIEW IN TELEGRAM
Зачем нужен метод bytes.Trim в Go

Метод bytes.Trim в Go удаляет все начальные и конечные байты, которые входят в заданный набор символов, называемый cutset. Он работает с срезами байтов и возвращает новый срез, в котором удалены все символы из cutset с начала и конца исходного среза. Этот метод не изменяет сам исходный срез.

Если в cutset указано несколько символов, метод удалит все символы, входящие в этот набор, с границ строки.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
😱 Завтра цена на курс «AI-агенты для DS» вырастет

Пока вы думаете — другие уже покупают. Что вы теряете, откладывая решение? Как минимум — 10 000 рублей, именно столько вы переплатите завтра. Как максимум — шанс войти в топ-1% дата-сайентистов, которые умеют строить AI-агенты.

🎓 Чему вы научитесь на курсе:
— адаптировать LLM под разные предметные области и данные
— собирать свою RAG-систему: от ретривера и реранкера до генератора и оценки качества
— строить AI-агентов с нуля — на основе сценариев, функций и взаимодействия с внешней средой

Решение за вами.

👉 Купить курс по старой цене
Можно ли использовать константы в switch

Да,в Go используют константы в выражениях switch. Это возможно, потому что константы имеют фиксированные значения, известные на этапе компиляции. Поскольку switch в Go работает с конкретными значениями, константы могут быть использованы в case выражениях без проблем, улучшая читаемость и предсказуемость кода.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Как работает iota и зачем он нужен при объявлении констант

iota — это встроенная константа в Go, которая используется для создания последовательных значений в блоках констант. Каждый раз, когда iota используется в новой строке внутри блока const, его значение автоматически увеличивается на 1.

Это позволяет генерировать последовательности значений для констант без необходимости вручную указывать их. Например, в первой строке в блоке const iota будет равно 0, во второй — 1, в третьей — 2 и так далее.

iota особенно полезен при объявлении наборов констант, таких как флаги, индексы или статус-коды, где важно, чтобы значения шли подряд.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
❗️ Фидбек по прошедшей неделе

Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.

Также приветствуются комментарии под постом.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Как bytes.FieldsFunc обрабатывает последовательности разделителей

Метод bytes.FieldsFunc рассматривает последовательности разделителей как одно место разбиения. То есть, если между двумя разделителями нет других символов, метод не создаст пустой подмассив между ними. Это поведение позволяет эффективно разделять строки, игнорируя лишние разделители.

Пример кода:

package main

import (
"bytes"
"fmt"
)

func main() {
input := []byte("apple,,orange,,banana")
result := bytes.FieldsFunc(input, func(c rune) bool {
return c == ',' // Разделяем по запятым
})
fmt.Println(result) // [[97 112 112 108 101] [111 114 97 110 103 101] [98 97 110 97]]
}


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Из-за чего могут возникать гонки данных

Гонки данных в Go возникают, когда несколько горутин одновременно пытаются изменить одну и ту же переменную или структуру данных без нормально синхронизации.

Чтобы избежать гонок данных, можно использовать мьютексы, которые блокируют доступ к данным, пока одна горутина их изменяет.

Также можно использовать каналы для безопасной передачи данных между горутинами, что позволяет избегать прямых изменений общих переменных. В некоторых случаях полезно использовать sync/atomic для работы с переменными без блокировок.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое ООП и как Go использует эту концепцию

ООП (объектно-ориентированное программирование) организует код вокруг объектов, которые содержат данные и методы для работы с этими данными.
В Go нет классов, но есть структуры (struct), которые выполняют роль классов, и методы, привязанные к этим структурам.


Go использует структуры и методы для реализации ООП, а также композицию и интерфейсы вместо наследования.
Это позволяет поддерживать принципы инкапсуляции и абстракции, но без классической иерархии наследования.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Zero value в Go

Zero value это дефолтное состояние переменных. Например, когда вы создаете переменную структуры, все её поля будут автоматически инициализированы своими нулевыми значениями.

В Go переменные всегда инициализируются нулевыми значениями при их создании. Это позволяет безопасно работать с ними, не беспокоясь о возможных неинициализированных значениях.

Значение зависит от типа переменной:
числовые типы (int, float64) — 0
булевые типы — false
для строк — пустая строка ""
указатели, функции, интерфейсы, срезы, карты и каналы — nil
массивы и структуры — нулевые значения соответствующих типов

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем разница между массивами и срезами

Массив — это структура данных с фиксированным размером, определенным при создании. Размер массива нельзя изменить.
Как его создать: [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().

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Какую роль играют пакеты в Go и почему они важны

В Go пакет — это основная единица организации кода. Он представляет собой набор файлов в одной директории с общим именем, указанным в строке package в начале каждого файла.

Пакеты позволяют структурировать программу, разделяя её на логические компоненты.

Особенности в пакетах:


• Объявление пакета — каждый файл начинается с директивы package <имя>

• Импорт пакетов — используем директиву import для доступа к функциям и типам из других пакетов

• Структура каталогов — пакет соответствует одной директории. Все файлы пакета должны быть в одной папке

• Экспортируемые элементы пишутся с заглавной буквы экспортируются и доступны в других пакетах, с маленькой — локальны
Пример:

var Pi = 3.14  // экспортируемая
var radius = 5 // неэкспортируемая


• Программы должны
содержать пакет main и функцию main()

Пакеты стандартной библиотеки fmt и math/rand

• Сторонние пакеты — устанавливаются через go get и импортируются по полному пути

• Модули в Go 1.11+ модули управляют зависимостями пакетов через файл go.mod

• Тесты размещаются в файлах с суффиксом _test.go в том же пакете

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое тип map в Go

В языке Go map представляет собой встроенный тип данных, реализующий структуру данных "хеш-таблица".
Он позволяет хранить и эффективно извлекать пары ключ-значение, где каждый ключ уникален и связан с определённым значением.

• Создание map
1. Использование функции make:
m := make(map[string]int)
m["a"] = 1
m["b"] = 2

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()


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Какую ошибку можно ожидать при преобразовании интерфейса к несовместимому типу

Если попытаться преобразовать интерфейс к несовместимому типу без проверки, то это приведет к панике.

Когда тип данных в интерфейсе не совпадает с ожидаемым типом, программа вызовет ошибку типа:
panic: interface conversion: <interface type> is <actual type>, not <expected type>


Программа завершит выполнение с ошибкой, и никаких дальнейших операций не будет выполнено. Чтобы избежать этого, рекомендуется всегда использовать проверку типа с ok, чтобы обработать несовпадения типов безопасным способом.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Тест для Golang-разработчиков, проверьте свои знания, готовы ли вы к обучению на курсе.

💻 Ответьте на 20 вопросов за 30 минут и проверьте, готовы ли вы к обучению на онлайн-курсе «Golang Developer. Professional» от OTUS. Сейчас Go становится все востребованнее, благодаря своей производительности, масштабируемости и экосистеме.

После 5 месяцев обучения вы сможете:
— Писать production-ready код, многопоточные и конкурентные программы.
— Понимать синтаксис и внутреннее устройство языка Go.
— Разворачивать микросервисы с помощью Docker.
— Проектировать и реализовывать микросервисную архитектуру на Go.

Также вас ждет прокачка навыков на реальных коммерческих кейсах и под руководством экспертов в этой области. Возможна рассрочка.

👉 ПРОЙТИ ТЕСТ

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Как в Go организовано управление памятью

В Go управление памятью полностью автоматизировано благодаря сборщику мусора. Это значит, что вам не нужно вручную выделять и освобождать память, как в C или C++.
Однако важно быть внимательным, особенно при работе с большими структурами данных, чтобы избежать утечек памяти.

Основные моменты:

• Сборщик мусора:
Алгоритм маркировки и освобождения автоматически помечает активные объекты, а затем очищает неактивные, освобождая память.

• Указатели:
В Go можно работать с указателями, но память выделяется при создании объектов и автоматически освобождается. Прямого управления выделением и освобождением через указатели нет.

• Циклические ссылки:
Хотя управление памятью автоматическое, неправильное использование, например, циклические ссылки, может привести к утечкам. Важно следить за ресурсами.

• Срезы:
Это динамические массивы, которые автоматически управляют памятью при изменении их размера.

• Стек и куча:
Память делится на стек (для локальных переменных) и кучу (для долгоживущих объектов). Управление памятью в куче осуществляется сборщиком мусора.

• Escape analysis:
Этот механизм анализирует, должен ли объект находиться на стеке или в куче, что позволяет Go более эффективно управлять памятью.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
2025/06/24 18:58:20
Back to Top
HTML Embed Code: