💬 Опишите концепцию "package aliasing" и кейсы ее использования.
Она относится к возможности присваивания псевдонима (алиаса) импортируемому пакету.
Это делается для удобства, чтобы избежать конфликтов имен или упростить обращение к пакетам с длинными или неудобными для использования именами.
И хотя алиасы могут быть полезны в определенных ситуациях, их следует использовать умеренно, чтобы не усложнять читаемость кода.
📌 Как это работает:
При импорте пакета можно указать алиас перед путем к пакету. Например:
Здесь
📌 Основные юзкейсы:
1. Избежание конфликтов имен: если мы импортируем два пакета с одинаковыми именами (например, две разные библиотеки
2. Упрощение длинных имен пакетов: некоторые пакеты имеют длинные пути импорта, и использование алиасов может сделать код более читаемым.
3. Изменение стандартного имени пакета: в некоторых случаях, особенно при работе с генерируемым кодом или когда стандартное имя пакета не является описательным, алиасы могут помочь сделать код более понятным.
Она относится к возможности присваивания псевдонима (алиаса) импортируемому пакету.
Это делается для удобства, чтобы избежать конфликтов имен или упростить обращение к пакетам с длинными или неудобными для использования именами.
И хотя алиасы могут быть полезны в определенных ситуациях, их следует использовать умеренно, чтобы не усложнять читаемость кода.
📌 Как это работает:
При импорте пакета можно указать алиас перед путем к пакету. Например:
import fm "fmt"
Здесь
fm
является псевдонимом для пакета fmt
. После этого, вместо использования fmt
, мы можем использовать fm
для доступа к функциям и типам из пакета fmt
.📌 Основные юзкейсы:
1. Избежание конфликтов имен: если мы импортируем два пакета с одинаковыми именами (например, две разные библиотеки
db
для работы с БД), мы можем использовать алиасы, чтобы различать их в коде.import (
sqlDB "project/sql/db"
nosqlDB "project/nosql/db"
)
2. Упрощение длинных имен пакетов: некоторые пакеты имеют длинные пути импорта, и использование алиасов может сделать код более читаемым.
import (
mh "myproject/subproject/module/helpers"
)
3. Изменение стандартного имени пакета: в некоторых случаях, особенно при работе с генерируемым кодом или когда стандартное имя пакета не является описательным, алиасы могут помочь сделать код более понятным.
👍9🔥4❤1
💬 Что такое указатель на указатель в Go?
В Go, указатель — это переменная, которая хранит адрес памяти другой переменной. Указатель на указатель — это переменная, которая хранит адрес памяти другого указателя, указывающий на некоторое значение или объект.
📌 Пример:
*
*
*
Таким образом,
В Go, указатель — это переменная, которая хранит адрес памяти другой переменной. Указатель на указатель — это переменная, которая хранит адрес памяти другого указателя, указывающий на некоторое значение или объект.
📌 Пример:
package main
import "fmt"
func main() {
a := 100
var b *int = &a // b — указатель на переменную a
var c **int = &b // c — указатель на указатель b
fmt.Println("Значение a:", a) // Исходное значение
fmt.Println("Адрес a:", &a) // Адрес переменной a
fmt.Println("Значение b:", b) // Адрес, хранящийся в b (адрес a)
fmt.Println("Разыменование b:", *b) // Разыменование b (значение a)
fmt.Println("Значение c:", c) // Адрес, хранящийся в c (адрес b)
fmt.Println("Разыменование c:", *c) // Разыменование c (значение b, т.е. адрес a)
fmt.Println("Двойное разыменование c:", **c) // Двойное разыменование c (значение a)
}
*
a
— обычная переменная типа int
.*
b
— указатель на int
, который хранит адрес переменной a
.*
c
— указатель на указатель на int
, который хранит адрес переменной b
.Таким образом,
c
является указателем на указатель. Он не только позволяет нам получить доступ к значению a
через двойное разыменование (**c
), но и изменять адрес, на который указывает b
, что может быть полезно в некоторых сценариях, например, при передаче указателя в функцию для его модификации.🔥14👍5❤1
Самые полезные каналы для программистов в одной подборке!
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
#️⃣C#
Библиотека шарписта
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel
☁️DevOps
Библиотека devops’а
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
🐘PHP
Библиотека пхпшника
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты
🐍Python
Библиотека питониста
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты
☕Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков
👾Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту
🦫Go
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go
🧠C++
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++
💻Другие профильные каналы
Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
💼Каналы с вакансиями
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
🤖Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *
* Организация Meta запрещена на территории РФ
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
#️⃣C#
Библиотека шарписта
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel
☁️DevOps
Библиотека devops’а
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
🐘PHP
Библиотека пхпшника
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты
🐍Python
Библиотека питониста
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты
☕Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков
👾Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту
🦫Go
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go
🧠C++
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++
💻Другие профильные каналы
Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
💼Каналы с вакансиями
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
🤖Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *
* Организация Meta запрещена на территории РФ
❤2
💬 Что такое рефлексия в go и чем она полезна?
Рефлексия в Go реализована в пакете
Рефлексия полезна в ситуациях, когда нам нужно работать с данными неизвестного типа, например, при сериализации/десериализации данных, реализации ORM систем и так далее.
С помощью рефлексии мы можем, например, определить тип переменной, прочитать и изменить её значения, вызвать методы динамически. Это делает код более гибким, но следует использовать рефлексию осторожно, так как она может привести к сложному и трудночитаемому коду, а также снизить производительность.
📌 Простые примеры
🔸Определение типа переменной:
В примере мы используем функцию
🔸Чтение и изменение значений:
Здесь мы используем
🔸Динамический вызов методов:
В этом примере мы создаем экземпляр структуры
Рефлексия в Go реализована в пакете
reflect
и представляет собой механизм, позволяющий коду исследовать значения, типы и структуры во время выполнения, без заранее известной информации о них. Рефлексия полезна в ситуациях, когда нам нужно работать с данными неизвестного типа, например, при сериализации/десериализации данных, реализации ORM систем и так далее.
С помощью рефлексии мы можем, например, определить тип переменной, прочитать и изменить её значения, вызвать методы динамически. Это делает код более гибким, но следует использовать рефлексию осторожно, так как она может привести к сложному и трудночитаемому коду, а также снизить производительность.
📌 Простые примеры
🔸Определение типа переменной:
package main
import (
"fmt"
"reflect"
)
func main() {
x := 42
fmt.Println("Тип переменной x:", reflect.TypeOf(x))
}
В примере мы используем функцию
reflect.TypeOf()
, чтобы определить тип переменной x
. Программа выведет int
, так как x
— целое число.🔸Чтение и изменение значений:
package main
import (
"fmt"
"reflect"
)
func main() {
x := 42
v := reflect.ValueOf(&x).Elem() // Получаем reflect.Value
fmt.Println("Исходное значение x:", x)
v.SetInt(43) // Изменяем значение x
fmt.Println("Новое значение x:", x)
}
Здесь мы используем
reflect.ValueOf()
для получения reflect.Value
переменной x
, а затем изменяем её значение с помощью SetInt()
. 🔸Динамический вызов методов:
package main
import (
"fmt"
"reflect"
)
type MyStruct struct {
Field int
}
func (m *MyStruct) UpdateField(val int) {
m.Field = val
}
func main() {
x := MyStruct{Field: 10}
// Получаем reflect.Value структуры
v := reflect.ValueOf(&x)
// Получаем метод по имени
method := v.MethodByName("UpdateField")
// Вызываем метод с аргументами
method.Call([]reflect.Value{reflect.ValueOf(20)})
fmt.Println("Обновленное значение поля:", x.Field)
}
В этом примере мы создаем экземпляр структуры
MyStruct
, получаем метод UpdateField
с помощью MethodByName
и вызываем его динамически с помощью Call
. Метод обновляет значение поля структуры.👍13🔥4
💬 Что из себя представляют сигналы отмены в контексте пакета context?
Передача сигнала отмены — один из юзкейсов контекстов в Go. Допустим, нужно создать приложение, которое вызывает
Наконец, когда происходит возврат из
Когда происходит возврат из
Передача сигнала отмены — один из юзкейсов контекстов в Go. Допустим, нужно создать приложение, которое вызывает
CreateFileWatcher(ctx context.Context, filename string)
внутри другой горутины. Эта функция создает file watcher, который постоянно читает файл и отслеживает его обновления. Когда предоставленный контекст становится неактуальным или отменяется, эта функция обрабатывает его, чтобы закрыть дескриптор файла.Наконец, когда происходит возврат из
main
, мы хотим, чтобы все обрабатывалось корректно путем закрытия этого файлового дескриптора. Поэтому нам нужно передать сигнал. Возможный подход — использовать context.WithCancel
, возвращающий контекст (возвращается первая переменная), который отменяется после вызова функции cancel
(возвращается вторая переменная): func main() {
ctx, cancel := context.WithCancel(context.Background()) // создание контекста, который может быть отменен
defer cancel() // откладываем вызов cancel
go func() {
CreateFileWatcher(ctx, "foo.txt") // вызов функции с использованием созданного контекста
}()
// ...
}
Когда происходит возврат из
main
, происходит и вызов функции cancel
для отмены контекста, переданного в CreateFileWatcher
, — чтобы дескриптор файла корректно закрылся.👍10
Forwarded from Библиотека Go-разработчика | Golang
🏃 Самоучитель по Go для начинающих. Часть 2. Ресурсы для изучения Go с нуля
Расскажем про актуальные и полезные источники информации по языку Go, которые подойдут для самостоятельного изучения и помогут погрузиться в захватывающий мир программирования.
🔗 Читать статью
🔗 Ссылка на первую часть
Расскажем про актуальные и полезные источники информации по языку Go, которые подойдут для самостоятельного изучения и помогут погрузиться в захватывающий мир программирования.
🔗 Читать статью
🔗 Ссылка на первую часть
👍10
💬 Что из себя представляет паттерн Fan-In (Мультиплексор), применяемый в облачной разработке?
Паттерн Fan-In мультиплексирует несколько входных каналов в один выходной канал.
В сервисах, имеющих несколько рабочих процессов, генерирующих результаты, бывает полезно объединить эти результаты в один общий поток. В таких случаях используется шаблон Мультиплексор, позволяющий читать данные из нескольких входных каналов и передавать их в один целевой канал.
📌 Компоненты:
◆
◆
◆
📌 Реализация:
Функция
Для каждого входного канала Funnel запускает специальную горутину, которая читает значения из назначенного ей канала и пересылает их в
📌 Использование функции
Паттерн Fan-In мультиплексирует несколько входных каналов в один выходной канал.
В сервисах, имеющих несколько рабочих процессов, генерирующих результаты, бывает полезно объединить эти результаты в один общий поток. В таких случаях используется шаблон Мультиплексор, позволяющий читать данные из нескольких входных каналов и передавать их в один целевой канал.
📌 Компоненты:
◆
Sources
— набор из одного или нескольких входных каналов одного типа, которые может принять Funnel
.◆
Destination
— выходной канал того же типа, что и каналы в наборе Sources
. Создается функцией Funnel
.◆
Funnel
— принимает набор Sources
и сразу же возвращает Destination
. Любые данные, поступающие из каналов в Sources
, передаются в Destination
.📌 Реализация:
Funnel
— функция, которая принимает до N
входных каналов (Sources
). Для каждого входного канала в Sources
функция Funnel
запускает отдельную горутину, читающую значения из назначенного ей канала и передающую их в выходной канал, общий для всех горутин (Destination
).Функция
Funnel
принимает переменное число аргументов — ноль или более каналов некоторого типа (int
в нашем примере): func Funnel(sources ...<-chan int) <-chan int {
dest := make(chan int) // Общий выходной канал
var wg sync.WaitGroup // Для автоматического закрытия dest, когда закроются все входящие каналы sources
wg.Add(len(sources)) // Установить размер WaitGroup
for _, ch := range sources { // Запуск горутины для каждого входного канала
go func(c <-chan int) {
defer wg.Done() // Уведомить WaitGroup, когда c закроется
for n := range c {
dest <- n
}
}(ch)
}
go func() { // Запустить горутину, которая закроет dest после закрытия всех входных каналов
wg.Wait()
close(dest)
}()
return dest
}
Для каждого входного канала Funnel запускает специальную горутину, которая читает значения из назначенного ей канала и пересылает их в
dest
, общий выходной канал для всех горутин.📌 Использование функции
Funnel
:func main() {
sources := make([]<-chan int, 0) // Создать пустой срез с каналами
for i := 0; i < 3; i++ {
ch := make(chan int)
sources = append(sources, ch) // Создать канал; добавить в срез sources
go func() { // Запустить горутину для каждого
defer close(ch) // Закрыть канал по завершении горутины
for i := 1; i <= 5; i++ {
ch <- i
time.Sleep(time.Second) }
}()
}
dest := Funnel(sources...)
for d := range dest {
fmt.Println(d)
}
}
👍12
💬 Как реализовать аргументы командной строки в Go?
Go предоставляет пакет стандартной библиотеки
🔸 Основные функции:
🔸 Парсинг: функция
📌 Простой пример:
📌 Основные преимущества:
🔸 Библиотека позволяет легко добавлять и изменять параметры командной строки, что делает код гибким и легко адаптируемым к изменениям требований.
🔸 Использование указателей для аргументов (
🔸 Библиотека позволяет задавать значения по умолчанию и описания для каждого аргумента, что улучшает понимание и использование командной строки.
🔸 Для более сложных сценариев использования аргументов командной строки можно использовать сторонние библиотеки, такие как
Go предоставляет пакет стандартной библиотеки
flag
, который является мощным инструментом для обработки аргументов командной строки. Он позволяет легко определять и парсить аргументы.🔸 Основные функции:
flag.String
, flag.Int
, flag.Bool
и т. д., используются для определения ожидаемых аргументов командной строки с указанием их типа.🔸 Парсинг: функция
flag.Parse()
используется для анализа аргументов командной строки и присвоения их соответствующим переменным.📌 Простой пример:
package main
import (
"flag"
"fmt"
)
func main() {
// Определение аргументов
host := flag.String("host", "localhost", "a string var")
port := flag.Int("port", 8080, "an int var")
verbose := flag.Bool("verbose", false, "a bool var")
// Парсинг аргументов
flag.Parse()
// Использование аргументов
fmt.Printf("Host: %s, Port: %d, Verbose: %t\n", *host, *port, *verbose)
}
📌 Основные преимущества:
🔸 Библиотека позволяет легко добавлять и изменять параметры командной строки, что делает код гибким и легко адаптируемым к изменениям требований.
🔸 Использование указателей для аргументов (
flag.String
, flag.Int
и т. д.) обеспечивает прямой доступ к значениям после парсинга.🔸 Библиотека позволяет задавать значения по умолчанию и описания для каждого аргумента, что улучшает понимание и использование командной строки.
🔸 Для более сложных сценариев использования аргументов командной строки можно использовать сторонние библиотеки, такие как
cobra
или urfave/cli
, которые предоставляют дополнительные возможности и улучшенный синтаксис.🔥7❤1
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
👍2
💬 Что из себя представляют методы типа в Go?
Метод типа (методы на типах) — это функция, которая привязана к определенному типу данных. Методы типов на самом деле являются функциями, однако определяются и используются немного по-другому.
Функционал методов типа добавляет в Go некоторые возможности ООП. Кроме того, методы типа нужны для работы интерфейсов.
📌 Создание методов типа
Предположим, что мы хотим выполнить вычисления с помощью матриц 2×2. Самым естественным способом реализации является определение нового типа данных и методов типа для сложения, вычитания и умножения матриц 2×2 с использованием этого нового типа данных.
Имея тип данных
Мы не обязаны использовать методы типа, если не хотим этого. Фактически любой метод типа может быть переписан как обычная функция. Следовательно,
Метод типа (методы на типах) — это функция, которая привязана к определенному типу данных. Методы типов на самом деле являются функциями, однако определяются и используются немного по-другому.
Функционал методов типа добавляет в Go некоторые возможности ООП. Кроме того, методы типа нужны для работы интерфейсов.
📌 Создание методов типа
Предположим, что мы хотим выполнить вычисления с помощью матриц 2×2. Самым естественным способом реализации является определение нового типа данных и методов типа для сложения, вычитания и умножения матриц 2×2 с использованием этого нового типа данных.
Имея тип данных
ar2x2
, мы можем создать для него метод типа functionName
следующим образом:func (a ar2x2) FunctionName(parameters) <return values> {
...
}
(a ar2x2)
— то, что делает функцию functionName()
методом типа, поскольку связывает ее с типом данных ar2x2
. Никакой другой тип данных не сможет использовать эту функцию. Однако мы можем без проблем реализовать functionName()
для других типов данных или в виде обычной функции. Если у нас есть переменная ar2x2
с именем varAr
, мы можем вызвать functionName()
как varAr.functionName(...)
, что выглядит как выбор поля структуры.Мы не обязаны использовать методы типа, если не хотим этого. Фактически любой метод типа может быть переписан как обычная функция. Следовательно,
functionName()
можно переписать так:func FunctionName(a ar2x2, parameters...) <return values> {
...
}
🔥6
💬 Можно ли давать имена возвращаемым значениям функции Go?
В отличие от C, Go позволяет называть возвращаемые значения Go-функции. Кроме того, когда такая функция имеет оператор
Следующая функция включена в
Здесь оператор
А здесь он эквивалентен
В отличие от C, Go позволяет называть возвращаемые значения Go-функции. Кроме того, когда такая функция имеет оператор
return
без каких-либо аргументов, она автоматически возвращает текущее значение каждого именованного возвращаемого значения в том порядке, в котором они были объявлены в сигнатуре.Следующая функция включена в
namedReturn.go
:func minMax(x, y int) (min, max int) {
if x > y {
min = y
max = x
return min, max
Здесь оператор
return
возвращает значения, сохраненные в переменных min
и max
. Обе переменные определены в сигнатуре, а не в теле функции.}
min = x
max = y
return
}
А здесь он эквивалентен
return min, max
. В его основе — сигнатура функции и использование именованных возвращаемых значений. При выполнении namedReturn.go
мы получаем такой вывод:$ go run namedReturn.go 1 -2
-2 1
-2 1
👍10🥱5🌚1
💬 Что из себя представляет буферизованный и небуферизованный файловый ввод-вывод?
🔸 Буферизованный файловый ввод-вывод — это использование буфера для временного хранения данных перед чтением или записью. Таким образом, вместо того чтобы читать файл побайтово, мы читаем сразу множество данных. Мы помещаем данные в буфер и ожидаем, пока кто-нибудь их не прочитает желаемым образом.
🔸 Небуферизованный файловый ввод-вывод: буфер для временного хранения данных не используется перед их фактическим чтением или записью‚ что может повлиять на производительность.
📌 Когда какой использовать?
При работе с критически важными данными небуферизованный файловый ввод-вывод, как правило, является лучшим выбором, поскольку буферизованное чтение может привести к использованию устаревших данных, а небуферизованная запись — к потере данных в случае сбоя. Однако в большинстве случаев однозначного ответа на этот вопрос нет.
🔸 Буферизованный файловый ввод-вывод — это использование буфера для временного хранения данных перед чтением или записью. Таким образом, вместо того чтобы читать файл побайтово, мы читаем сразу множество данных. Мы помещаем данные в буфер и ожидаем, пока кто-нибудь их не прочитает желаемым образом.
🔸 Небуферизованный файловый ввод-вывод: буфер для временного хранения данных не используется перед их фактическим чтением или записью‚ что может повлиять на производительность.
📌 Когда какой использовать?
При работе с критически важными данными небуферизованный файловый ввод-вывод, как правило, является лучшим выбором, поскольку буферизованное чтение может привести к использованию устаревших данных, а небуферизованная запись — к потере данных в случае сбоя. Однако в большинстве случаев однозначного ответа на этот вопрос нет.
👍6
Forwarded from Библиотека джависта | Java, Spring, Maven, Hibernate
🧠Чему вы бы хотели научиться?
Расскажите нам о ваших пожеланиях: какие навыки вы хотели бы прокачать в ближайшее время или какую профессию хотели бы приобрести?
За прохождение опроса вы получите промокод на скидку 15% на все наши курсы до конца 2024 года.
👉Опрос по ссылке👈
Расскажите нам о ваших пожеланиях: какие навыки вы хотели бы прокачать в ближайшее время или какую профессию хотели бы приобрести?
За прохождение опроса вы получите промокод на скидку 15% на все наши курсы до конца 2024 года.
👉Опрос по ссылке👈
💬 Опишите популярный кейс использования /dev/random в Go и представьте простой пример.
Назначение
📌 Простой пример:
Есть два представления‚ прямой и обратный порядок, которые имеют отношение к порядку байтов во внутреннем представлении. В нашем случае мы используем прямой порядок. Порядок здесь имеет отношение к тому‚ как различные вычислительные системы упорядочивают несколько байтов информации.
💡Реальный пример порядка — это то, как в разных языках по-разному читается текст.
💡В представлении с обратным порядком байты считываются слева направо, в то время как прямой порядок подразумевает считывание справа налево. Для значения
Назначение
/dev/random
— генерация случайных данных, которые можно использовать для тестирования программ или в качестве исходных данных для генератора случайных чисел. 📌 Простой пример:
package main
import (
"encoding/binary"
"fmt"
"os"
)
func main() {
f, err := os.Open("/dev/random")
defer f.Close()
if err != nil {
fmt.Println(err)
return }
var seed int64
binary.Read(f, binary.LittleEndian, &seed)
fmt.Println("Seed:", seed)
}
Есть два представления‚ прямой и обратный порядок, которые имеют отношение к порядку байтов во внутреннем представлении. В нашем случае мы используем прямой порядок. Порядок здесь имеет отношение к тому‚ как различные вычислительные системы упорядочивают несколько байтов информации.
💡Реальный пример порядка — это то, как в разных языках по-разному читается текст.
💡В представлении с обратным порядком байты считываются слева направо, в то время как прямой порядок подразумевает считывание справа налево. Для значения
0x01234567
, хранение которого требует четырех байтов, представление с обратным порядком равно 01|23|45|67
‚ тогда как прямой порядок выглядит как 67|45|23|01
.❤1👍1
💬 Каково основное назначение и чем полезен пакет runtime/coverage, представленный в Go 1.20?
Новый пакет предоставляет API для записи данных профиля покрытия во время выполнения для долгосрочных и/или серверных программ, которые не завершаются стандартным образом через
Это позволяет собирать данные о покрытии кода тестами в реальном времени, что особенно полезно для мониторинга и улучшения качества кода в продакшн окружениях, где традиционные методы сбора данных о покрытии могут быть неэффективны или неприменимы.
Новый пакет предоставляет API для записи данных профиля покрытия во время выполнения для долгосрочных и/или серверных программ, которые не завершаются стандартным образом через
os.Exit()
.Это позволяет собирать данные о покрытии кода тестами в реальном времени, что особенно полезно для мониторинга и улучшения качества кода в продакшн окружениях, где традиционные методы сбора данных о покрытии могут быть неэффективны или неприменимы.
tip.golang.org
Go 1.20 Release Notes - The Go Programming Language
🔥4
Forwarded from Библиотека Go-разработчика | Golang
🏃 Самоучитель по Go для начинающих. Часть 4. Переменные. Типы данных и их преобразования. Основные операторы.
В этом уроке мы изучим фундаментальные понятия в программировании: переменные, типы данных и операторы, а также научимся преобразовывать один тип данных в другой.
👉 Читать статью
👉 Часть 1
👉 Часть 2
👉 Часть 3
В этом уроке мы изучим фундаментальные понятия в программировании: переменные, типы данных и операторы, а также научимся преобразовывать один тип данных в другой.
👉 Читать статью
👉 Часть 1
👉 Часть 2
👉 Часть 3