💡Предварительная компиляция стандартной библиотеки
С версии 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
Redowan's Reflections
Omitting dev dependencies in Go binaries
As of now, unlike Python or NodeJS, Go doesn’t allow you to specify your development
dependencies separately from those of the application. However, I like to specify the dev
dependencies explicitly for better reproducibility.
While working on a new CLI tool…
dependencies separately from those of the application. However, I like to specify the dev
dependencies explicitly for better reproducibility.
While working on a new CLI tool…
👍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