⤵️ Сократите объем ресурсов и производительность сравнения с помощью нового пакета unique в Go 1.23
Интернирование (англ. interning), термин, изначально введенный Lisp, представляет собой процесс хранения только одной копии значения в памяти и совместного использования уникальной ссылки на нее вместо выделения нескольких копий и пустой траты памяти.
Например, компилятор Go уже выполняет интернирование строковых констант во время компиляции, поэтому вместо выделения нескольких идентичных строк он выделит один экземпляр строки и совместно использует ссылку на него, как показано на первом скрине.
До Go 1.23 интернирование значений времени выполнения было доступно только через сторонние пакеты. Однако, начиная с Go 1.23, интернирование теперь включено в стандартную библиотеку через новый пакет
Интернирование (англ. interning), термин, изначально введенный Lisp, представляет собой процесс хранения только одной копии значения в памяти и совместного использования уникальной ссылки на нее вместо выделения нескольких копий и пустой траты памяти.
Например, компилятор Go уже выполняет интернирование строковых констант во время компиляции, поэтому вместо выделения нескольких идентичных строк он выделит один экземпляр строки и совместно использует ссылку на него, как показано на первом скрине.
До Go 1.23 интернирование значений времени выполнения было доступно только через сторонние пакеты. Однако, начиная с Go 1.23, интернирование теперь включено в стандартную библиотеку через новый пакет
unique
. Go-разработчик Joseph Woodward демонстрирует преимущества нового пакета.👍19🥰3❤2❤🔥1
🔥 Go 1.23 за 23 минуты — бесплатный мини-курс от Matt Boyle, включающий все ключевые моменты новой версии языка.
☑️ Вы узнаете про:
• Итераторы. Что это такое и что вам нужно знать?
• Изменения в пакетах
• Как новый пакет
• В чем заключается новое изменение телеметрии и как его можно (по желанию) включить.
☑️ Вы узнаете про:
• Итераторы. Что это такое и что вам нужно знать?
• Изменения в пакетах
slice
и map
.• Как новый пакет
unique
может помочь оптимизировать использование памяти.• В чем заключается новое изменение телеметрии и как его можно (по желанию) включить.
👍20👾4❤1🥱1
Forwarded from Библиотека программиста | программирование, кодинг, разработка
🚀 Ускорьте свою базу данных: 7 проверенных методов масштабирования и оптимизации
Масштабирование улучшает производительность и повышает надежность систем хранения данных путем оптимизации использования ресурсов и распределения нагрузки. В этой статье мы рассмотрим 7 эффективных методов масштабирования и оптимизации базы данных.
🔗 Читать статью
🔗 Зеркало
Масштабирование улучшает производительность и повышает надежность систем хранения данных путем оптимизации использования ресурсов и распределения нагрузки. В этой статье мы рассмотрим 7 эффективных методов масштабирования и оптимизации базы данных.
🔗 Читать статью
🔗 Зеркало
😁14❤2👍2
Приглашенный спикер: Павел Запольский – Senior Quantitative Researcher at Exness и Co-founder GrowLytics. Запустивший более 10 проектов по машинному обучению и анализу данных для ведущих компаний.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5😁5❤1
💡 Кстати, в Go 1.23 представлена новая функция Chunk, которую можно использовать для разделения слайса на подслайсы.
▶️ Вывод:
▶️ Вывод:
Product list 0 [TV Fridge]
Product list 1 [Washing Machine Dish Washer]
👍64😁7🤔5🔥4👏2
🔥 Объяснение Go maps: как на самом деле хранятся пары ключ-значение
Очередной лонгрид от Phuong Le, который на простых иллюстрациях объясняет не самые простые аспекты Go. Этот гайд посвящен типу map и всему, что с ним связано.
👉 Читать
Очередной лонгрид от Phuong Le, который на простых иллюстрациях объясняет не самые простые аспекты Go. Этот гайд посвящен типу map и всему, что с ним связано.
👉 Читать
👍42🔥7👾1
Forwarded from Азбука айтишника
🔧 Компилятор своими руками: краткий гид для начинающих
В этой статье мы разберем анатомию простейшего компилятора: лексер, парсер и LLVM. Вы узнаете, как эти компоненты взаимодействуют для преобразования исходного кода в исполняемый файл.
🔗 Ссылка на статью
В этой статье мы разберем анатомию простейшего компилятора: лексер, парсер и LLVM. Вы узнаете, как эти компоненты взаимодействуют для преобразования исходного кода в исполняемый файл.
🔗 Ссылка на статью
👍6🥱3
🛠️💥 Использование Go для всего
Зачем использовать 10 инструментов, если можно освоить один? Познакомьтесь с соло-разработчиком Маркусом, который превратил Go в свой швейцарский армейский нож. От CLI до игр для Nintendo Switch — Go делает все!
👉 Читать
Зачем использовать 10 инструментов, если можно освоить один? Познакомьтесь с соло-разработчиком Маркусом, который превратил Go в свой швейцарский армейский нож. От CLI до игр для Nintendo Switch — Go делает все!
👉 Читать
www.maragu.dev
Go is my hammer, and everything is a nail
Always choose the right tool for the job? Nah. I use Go basically everywhere, which either makes me insightful or stupid. Decide for yourself! :D
👍19😁2💯1
Вы наверняка знакомы со «стандартным» способом ветвления кода в зависимости от заданного значения:
Так работает
Но оператор
1. Несколько значений в одном
В
Заданное значение может использоваться только в одном блоке
2. Инициализатор, как в цикле
Вы можете инициализировать значение перед использованием его в
3. Нет выражения
Если текущее значение
4. Переключение по типу переменной.
Если ваш код получает значение интерфейса из какого-то источника, вы можете использовать переключение по типу, чтобы проверить фактический тип этого значения:
5. Переключение по типу параметра.
Это может показаться немного эзотерическим: вы можете определить дженерик функцию, где типовой параметр не используется в списке параметров. Вместо этого оператор
Как и с выражениями
👉 Go Playground
#tip
switch a {
case 1:
fmt.Println("1")
case 2:
fmt.Println("2")
default:
fmt.Println("default")
}
Так работает
switch
в Go и во многих других языках (за исключением того, что в Go не происходит перехода к последующим case
).Но оператор
switch
может делать больше. Вот несколько кейсов.1. Несколько значений в одном
case
.В
case
можно указать несколько значений для сопоставления:
switch a {
case 1:
fmt.Println("1")
case 2, 3, 4:
fmt.Println("2, 3 или 4")
// case 1,2: // ошибка: дублирование case 1, дублирование case 2
// fmt.Println("1 или 2")
}
Заданное значение может использоваться только в одном блоке
case
. Дублирование значений в case
вызовет ошибку.2. Инициализатор, как в цикле
for
.Вы можете инициализировать значение перед использованием его в
switch
. Область видимости переменной a
ограничена конструкцией switch
:
switch a := f(); a {
case 1:
fmt.Println("1")
case 2:
fmt.Println("2")
}
3. Нет выражения
switch
, но есть выражения case
.case
не ограничен статическими значениями. Если вы опустите выражение switch
, вы можете использовать выражения для каждого case
:
switch {
case a == 1:
fmt.Println("1")
case a >=2 && a <= 4:
fmt.Println("2")
case a <= 5:
fmt.Println("3")
}
Если текущее значение
a
совпадает более чем с одним case
, выбирается первый подходящий.4. Переключение по типу переменной.
Если ваш код получает значение интерфейса из какого-то источника, вы можете использовать переключение по типу, чтобы проверить фактический тип этого значения:
switch v := a.(type) {
case int:
fmt.Println("a — это int:", v)
case string, []byte:
fmt.Println("a — это string:", v)
}
5. Переключение по типу параметра.
Это может показаться немного эзотерическим: вы можете определить дженерик функцию, где типовой параметр не используется в списке параметров. Вместо этого оператор
switch
может ссылаться на этот параметр, чтобы проверить значение параметра:
func do[T comparable](a any) {
switch v := a.(type) {
case int:
fmt.Println("a — это int:", v)
case T:
fmt.Printf("a — это %T: %v", v, v)
case []T:
fmt.Println("a — это срез:", v)
case []byte:
fmt.Println("a — это срез байт:", v)
}
}
func main() {
do[bool](a)
do[bool](true)
do[int]([]int{1, 2, 3})
}
Как и с выражениями
case
, если фактический тип a
совпадает с несколькими case
, выбирается первый подходящий.👉 Go Playground
#tip
go.dev
Go Playground - The Go Programming Language
👍60❤7🥱5🔥3😍1
❗Вакансии «Библиотеки программиста» — ждем вас в команде!
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉авторов в наше медиа proglib.io
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉авторов в наше медиа proglib.io
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
ad.proglib.io
Вакансии в медиа «Библиотека программиста»
Количество проектов в редакции постоянно растет, так что нам всегда нужны специалисты
Что происходит, когда вы запускаете
go test
? Конечно, Go запускает ваши тесты. Но на практике это далеко не так просто и прямолинейно. Автор статьи Matt T. Proud любит понимать, как работают инструменты, с которыми он работает, поэтому он углубился во внутренности
go test
и обнаружил механизм, который является «довольно элегантным».👉 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Forwarded from Библиотека программиста | программирование, кодинг, разработка
🐘🧠 Оптимизация использования памяти в PostgreSQL: секреты профессионалов
Сложные (и многочисленные) операции в базе данных требуют солидного объема оперативной памяти — например, для создания набора результатов PostgreSQL обычно приходится:
🔹 Выполнить поиск по индексу.
🔹 Извлечь связанные строки из одной или нескольких таблиц.
🔹 Объединить, отфильтровать, агрегировать и отсортировать кортежи в пригодный для использования результат.
Каждый из этих шагов требует памяти, и PostgreSQL может обрабатывать тысячи таких запросов одновременно. Так что рано или поздно перед разработчиками любого серьезного проекта встает необходимость решения нескольких сложных вопросов:
🔹 Как грамотно оптимизировать использование доступной памяти?
🔹 В каком соотношении распределить ОЗУ между несколькими типами памяти, которые необходимы PostgreSQL для эффективной работы?
🔹 Как предотвратить защитное завершение операционной системой процесса PostgreSQL, который использует слишком много памяти?
Для ответов на все эти вопросы нужно определить, сколько именно памяти использует PostgreSQL для основных процессов — а это сама по себе нетривиальная задача. Советы по настройке памяти так многочисленны и разнообразны, что в них сложно сориентироваться.
Поэтому в этой статье мы сведем всю мудрость экспертов к конкретным шагам, которые помогут максимально эффективно распорядиться доступной памятью.
🔗 Читать статью
🔗 Зеркало
Сложные (и многочисленные) операции в базе данных требуют солидного объема оперативной памяти — например, для создания набора результатов PostgreSQL обычно приходится:
🔹 Выполнить поиск по индексу.
🔹 Извлечь связанные строки из одной или нескольких таблиц.
🔹 Объединить, отфильтровать, агрегировать и отсортировать кортежи в пригодный для использования результат.
Каждый из этих шагов требует памяти, и PostgreSQL может обрабатывать тысячи таких запросов одновременно. Так что рано или поздно перед разработчиками любого серьезного проекта встает необходимость решения нескольких сложных вопросов:
🔹 Как грамотно оптимизировать использование доступной памяти?
🔹 В каком соотношении распределить ОЗУ между несколькими типами памяти, которые необходимы PostgreSQL для эффективной работы?
🔹 Как предотвратить защитное завершение операционной системой процесса PostgreSQL, который использует слишком много памяти?
Для ответов на все эти вопросы нужно определить, сколько именно памяти использует PostgreSQL для основных процессов — а это сама по себе нетривиальная задача. Советы по настройке памяти так многочисленны и разнообразны, что в них сложно сориентироваться.
Поэтому в этой статье мы сведем всю мудрость экспертов к конкретным шагам, которые помогут максимально эффективно распорядиться доступной памятью.
🔗 Читать статью
🔗 Зеркало
👍5❤2
Солидный список с некоторыми выполнимыми и не очень выполнимыми пунктами. С выполнимой стороны есть ordered maps и default arguments. С не очень выполнимой стороны null/nilability — давняя спорная тема, которая, вероятно, нарушит обратную совместимость.
👉 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱8👍3🤔3