💡Предварительная компиляция стандартной библиотеки
С версии Go 1.20 стандартная библиотека больше не компилируется заранее при установке Go. Вместо этого, когда проект компилируется, необходимые части стандартной библиотеки компилируются по мере необходимости и добавляются в локальный кэш.
Исходя из исследования (на немецком языке), это может оказать огромное влияние на время компиляции.
Теперь представьте систему сборки, которая начинает с нуля для каждой сборки, — например, потому что инструментарий Go находится в контейнере, который удаляется после каждой сборки.
Зависимости проекта от стандартной библиотеки таким образом компилируются снова и снова для каждой сборки.
📌 Решение простое:
Эта команда компилирует стандартную библиотеку один раз. Зафиксируйте полученное состояние установки Go и наслаждайтесь более быстрым временем сборки.
С версии Go 1.20 стандартная библиотека больше не компилируется заранее при установке Go. Вместо этого, когда проект компилируется, необходимые части стандартной библиотеки компилируются по мере необходимости и добавляются в локальный кэш.
Исходя из исследования (на немецком языке), это может оказать огромное влияние на время компиляции.
Теперь представьте систему сборки, которая начинает с нуля для каждой сборки, — например, потому что инструментарий Go находится в контейнере, который удаляется после каждой сборки.
Зависимости проекта от стандартной библиотеки таким образом компилируются снова и снова для каждой сборки.
📌 Решение простое:
go install std
Эта команда компилирует стандартную библиотеку один раз. Зафиксируйте полученное состояние установки Go и наслаждайтесь более быстрым временем сборки.
👍90❤1
🧰 avo — пакет для генерации x86 assembly с помощью Go. Основная цель — облегчить процесс написания и поддержки assembly кода, который часто используется для оптимизации производительности в критических участках программ.
👉 GitHub с полным описанием и примерами
//go:build ignore
package main
import . "github.com/mmcloughlin/avo/build"
func main() {
TEXT("Add", NOSPLIT, "func(x, y uint64) uint64")
Doc("Add adds x and y.")
x := Load(Param("x"), GP64())
y := Load(Param("y"), GP64())
ADDQ(x, y)
Store(y, ReturnIndex(0))
RET()
Generate()
}
//go:generate go run asm.go -out add.s -stubs stub.go
👉 GitHub с полным описанием и примерами
GitHub
GitHub - mmcloughlin/avo: Generate x86 Assembly with Go
Generate x86 Assembly with Go. Contribute to mmcloughlin/avo development by creating an account on GitHub.
👍17❤1
This media is not supported in your browser
VIEW IN TELEGRAM
#юмор
Please open Telegram to view this post
VIEW IN TELEGRAM
😁37👍4🥱4🌚1
Во время разработки на Go вы можете сравнить два значения
time.Time с помощью операторов сравнения, но компилятор не даст этого сделать.Использование
== и != в свою очередь допустимо в Go, но надо быть осторожным, потому что этот функционал может делать не совсем то, что вы намеревались. Разбираемся, что находится под капотом у типа time.Time ⬇️👉 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥2💯1
Какие критерии экспертности для вас важны?
Anonymous Poll
52%
Опыт работы
45%
Успешные кейсы
8%
Известность в сообществе
25%
Умение обучать других
7%
Образование
2%
Наличие сертификатов
62%
Глубокие знания в специализированной области
1%
Свой вариант (напишу в комментарии)
17%
Посмотреть результаты
👍5
Forwarded from Библиотека девопса | DevOps, SRE, Sysadmin
💰⬆️ 10 факторов, влияющих на зарплату программиста
Узнайте 10 факторов, как превратиться из рядового программиста в высокооплачиваемого специалиста и научиться аргументированно запрашивать зарплату выше рынка.
Читать статью
#новость
Узнайте 10 факторов, как превратиться из рядового программиста в высокооплачиваемого специалиста и научиться аргументированно запрашивать зарплату выше рынка.
Читать статью
#новость
👍6🥱2🌚2
🤔 Ну что, давненько не было холиваров. Прошлогодняя статья-сравнение актуализирована в соответствии с реалиями 2024 года (хотя плюсы и минусы остаются весьма схожими).
👉 Читайте подробнее, чтобы узнать о преимуществах/недостатках обоих языков и некоторых компромиссах.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱37😁12👍9👾2
Forwarded from Библиотека джависта | Java, Spring, Maven, Hibernate
👨💻🧩 Психология и ИТ: 17 личностных качеств, необходимых для успешной карьеры
В статье разберем, какие качества необходимы для успешного старта в IT-сфере.
Читать статью
#новость
В статье разберем, какие качества необходимы для успешного старта в IT-сфере.
Читать статью
#новость
👍8😁2🌚2❤1
Представьте, что вы оказались в сложной ситуации, и вам нужно принять решение. Какого сотрудника вы возьмете в команду?
Anonymous Poll
18%
С достойным портфолио и хард-скиллами, но неприятного в общении
61%
Легкого в общении и целеустремленного, но проседающего в технических навыках
20%
Посмотреть результаты
🌚9😁1
Команда Sourcegraph делится опытом оптимизации некоторых базовых математических операций в Code AI и описывает различные этапы оптимизации, начиная с простой реализации на Go и постепенно углубляясь в оптимизацию: от loop unrolling до bounds check elimination.
Но настоящий прорыв произошел при использовании SIMD (single instruction, multiple data) и quantization. Этот опыт показал, насколько мощным может быть низкоуровневое программирование даже в таком высокоуровневом языке, как Go👇
🔗 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🌚2
⚡️Самые полезные каналы по Go в одной папке
В ней:
➖ канал для подготовки к собеседованиям
➖ интересные задачи
➖ основной канал (этот)
➖ книги по Go
➖ лучшие вакансии из сферы
➖ и наш чат, в котором можно общаться и задавать вопросы
Добавляйте 👉 тык сюда
В ней:
Добавляйте 👉 тык сюда
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍5🥱3🌚2👏1
🧰 Goyek — библиотека для автоматизации задач, в которой последние определяются в стиле Cobra, а экшены напоминают юнит-тесты.
В версии 2.1 добавлена поддержка параллельного выполнения задач.
👉 GitHub
В версии 2.1 добавлена поддержка параллельного выполнения задач.
package main
import (
"flag"
"github.com/goyek/goyek/v2"
"github.com/goyek/x/cmd"
)
var msg = flag.String("msg", "greeting message", "Hello world!")
var hello = flow.Define(goyek.Task{
Name: "hello",
Usage: "demonstration",
Action: func(a *goyek.A) {
a.Log(*msg)
cmd.Exec(a, "go version")
},
})
👉 GitHub
👍10
📌 Подборка докладов с конференций Saint HighLoad++ и HighLoad++ 2023:
🌐 Внутренняя платформа для разработки и разработчиков: за что платит бизнес? / Александр Чубинский
🌐 Авито Автозагрузка: как качать миллионы фотографий в сутки / Евгений Толмачев (Авито)
🌐 Ах, как хочется вернуться, ворваться в монолит! / Павел Лакосников (Авито)
🌐 YTsaurus SPYT: помогаем планировщику Apache Spark быть ещё эффективнее / Алексей Шишкин (Яндекс)
🌐 YTsaurus: опыт эксплуатации хранилища из 180К дисков / Павел Сушин (Яндекс)
🌐 YTsaurus — это будущее DWH, и в Яндекс Маркете оно наступило / Филипп Козьмин (Яндекс Маркет)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🌚2
💬 Как вам новый метод HTTP-роутинга
👉 Подробнее
[METHOD ][HOST]/[PATH], который ждет нас в Go 1.22?mux := http.NewServeMux()
mux.HandleFunc("GET 127.0.0.1/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello")
})
mux.HandleFunc("GET localhost/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Bonjour")
})
👉 Подробнее
🤔25👍15🔥7🌚1
Руководство основано на документации и дополнено наглядными примерами от автора.
👉 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20
🔄 Использование RabbitMQ streams в Go
Ранее Percy Bolmér исследовал возможности использования RabbitMQ в Go для построения Event Driven Architecture.
В новом руководстве он затрагивает тему Streams, которые привнесли в RabbitMQ множество функций и ранее были преимуществом Kafka.
📌 Из руководства вы узнаете:
🔸Что такое streams и как они работают
🔸Как использовать streams в Go
🔸Stream Core/Plugin и основные различия
🔸Subentries и Compression
🔸Deduplication
Ранее Percy Bolmér исследовал возможности использования RabbitMQ в Go для построения Event Driven Architecture.
В новом руководстве он затрагивает тему Streams, которые привнесли в RabbitMQ множество функций и ранее были преимуществом Kafka.
📌 Из руководства вы узнаете:
🔸Что такое streams и как они работают
🔸Как использовать streams в Go
🔸Stream Core/Plugin и основные различия
🔸Subentries и Compression
🔸Deduplication
🔥19👍2
В настоящее время, в отличие от Python или NodeJS, Go не позволяет указывать зависимости разработки отдельно от зависимостей приложения. Однако автор предпочитает явно указывать зависимости разработки для лучшей воспроизводимости.
Работая над новым CLI-инструментом для проверки неработающих URL-адресов в файлах markdown, автор столкнулся с интересным соглашением: можно указать зависимости разработки в файле
tools.go и затем исключить их при сборке бинарного файла, используя тег сборки.Вот как это работает. Предположим, у нашего проекта
foo есть следующая структура:foo
├── go.mod
├── go.sum
└── main.go
Файл
main.go содержит простую функцию "hello-world", использующую стороннюю зависимость:package main
import (
"fmt"
// Cowsay - это сторонняя зависимость приложения
cowsay "github.com/Code-Hex/Neo-cowsay"
)
func main() {
fmt.Println(cowsay.Say(cowsay.Phrase("Hello, World!")))
}
Здесь
Neo-cowsay — это зависимость приложения. Для инициализации проекта запускаются следующие команды:go mod init example.com/foo # создает файлы go.mod и go.sum
go mod tidy # устанавливает зависимости приложения
Теперь предположим, что мы хотим добавить следующие зависимости разработки:
golangci-lint для линтинга проекта в CI и gofumpt как более строгий gofmt. Поскольку эти инструменты не импортируются напрямую, они не отслеживаются инструментарием сборки.Но можно воспользоваться следующим воркфлоу:
1. Разместить файл
tools.go в корневой директории.2. Импортировать зависимости разработки в этом файле.
3. Запустить
go mod tidy, чтобы отслеживать как зависимости приложения, так и зависимости разработки через go.mod и go.sum.4. Указать тег сборки в
tools.go, чтобы исключить зависимости разработки из бинарного файла.В этом случае файл
tools.go выглядит следующим образом:// go:build tools
package tools
import (
// Зависимости разработки
_ "github.com/golangci/golangci-lint/cmd/golangci-lint"
_ "mvdan.cc/gofumpt"
)
Теперь, если вы запустите
go mod tidy, инструментарий Go будет отслеживать зависимости через файлы go.mod и go.sum. Вы можете проверить зависимости в go.mod.Хотя зависимости разработки отслеживаются вместе с зависимостями приложения, тег сборки
// go:build tools в начале файла tools.go скажет инструментарию сборки игнорировать их при создании бинарного файла.Из корневой директории
foo можно собрать проект, запустив:go build main.go
Это создаст бинарный файл
main в корневой директории. Чтобы убедиться, что бинарный файл не содержит зависимости разработки, запустите:go tool nm main | grep -Ei 'golangci-lint|gofumpt'
Это не вернет ничего, если зависимости разработки не упакованы в бинарный файл.
Но если вы сделаете это для зависимости приложения, она выведет артефакты:
go tool nm main | grep -Ei 'cowsay'
Команда выведет:
1000b6d40 T github.com/Code-Hex/Neo-cowsay.(*Cow).Aurora
1000b6fb0 T github.com/Code-Hex/Neo-cowsay.(*Cow).Aurora.func1
1000b5610 T github.com/Code-Hex/Neo-cowsay.(*Cow).Balloon
1000b6020 T github.com/Code-Hex/Neo-cowsay.(*Cow).Balloon.func1
...
Если по какой-то причине вы хотите включить зависимости разработки в свой бинарный файл, вы можете передать тег
tools при сборке бинарного файла:go build --tags tools main.go
#tip
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33❤2🤔2🥱2
testing и дополнен библиотекой Gomega.Фреймворк предоставляет подход к написанию тестов, близкий к методологии BDD, и используется для упрощения процесса написания сложных тестовых сценариев, делая вывод тестов более читаемым и понятным.
👉 GitHub
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - onsi/gomega: Ginkgo's Preferred Matcher Library
Ginkgo's Preferred Matcher Library. Contribute to onsi/gomega development by creating an account on GitHub.
🥱12👍6❤2🥰2
🤖 Команда Google недавно сделала новое семейство мультимодальных ИИ-моделей Gemini доступным через API с щедрым уровнем бесплатного использования, а также выпустила SDK для нескольких популярных ЯП, включая Go.
Eli Bendersky показал простой пример работы с Go SDK, в котором текстовые вопросы к модели сочетаются с изображениями.
👉 Подробнее
Eli Bendersky показал простой пример работы с Go SDK, в котором текстовые вопросы к модели сочетаются с изображениями.
👉 Подробнее
🔥14❤2👍2🤩2🌚2