Размер типа структуры без полей ненулевого размера равен нулю. Размер типа массива, длина которого равна нулю или размер элемента которого равен нулю, также равен нулю. Это можно доказать с помощью примера выше.
В Go размеры часто обозначаются как значения int. Это означает, что максимально возможная длина массива равна MaxInt, значение которой равно 2^63-1 в 64-битных ОС. Однако длина массивов с ненулевыми размерами элементов жестко ограничена стандартным компилятором Go и рантаймом.
📌 Например👇
#tip #go #beginner
В Go размеры часто обозначаются как значения int. Это означает, что максимально возможная длина массива равна MaxInt, значение которой равно 2^63-1 в 64-битных ОС. Однако длина массивов с ненулевыми размерами элементов жестко ограничена стандартным компилятором Go и рантаймом.
📌 Например👇
var x [1<<63-1]struct{} // okay
var y [2000000000+1]byte // compilation error
var z = make([]byte, 1<<49) // panic: runtime error: makeslice: len out of range#tip #go #beginner
👍13
Мы можем использовать цикл for-range для моделирования циклов for i in 0..N в некоторых других языках, как показано на примере выше.
Шаги первых двух циклов должны быть известны во время компиляции, тогда как у последнего нет этого требования. Но последний выделяет чуть больше памяти (в стеке, под заголовок слайса).
#tip #go #beginner
Шаги первых двух циклов должны быть известны во время компиляции, тогда как у последнего нет этого требования. Но последний выделяет чуть больше памяти (в стеке, под заголовок слайса).
#tip #go #beginner
🌚14👍11⚡3❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7😁4❤3🌚2
#tip #go #beginner
О случайном порядке итерации типа map
Встроенные мапы Go не поддерживают порядок входных значений. Поэтому при использовании цикла for-range для итерации записей мапы порядок записей рандомизируется. Запустив код из примера, вы увидите, что результаты могут отличаться.
Но обратите внимание, что функции вывода на экран в стандартном пакете fmt сортируют записи (по ключам) мапы. То же самое происходит с выводами вызовов функции json.Marshal.
О случайном порядке итерации типа map
Встроенные мапы Go не поддерживают порядок входных значений. Поэтому при использовании цикла for-range для итерации записей мапы порядок записей рандомизируется. Запустив код из примера, вы увидите, что результаты могут отличаться.
Но обратите внимание, что функции вывода на экран в стандартном пакете fmt сортируют записи (по ключам) мапы. То же самое происходит с выводами вызовов функции json.Marshal.
👍25
#tip #go #beginner
Использование ссылки на переменную итератора цикла
В Go переменная итератора цикла — это единственная переменная, которая принимает разные значения на каждой итерации цикла. Это очень эффективно, но может привести к непреднамеренному поведению при неправильном использовании. Смотрите пример слева, который выдаст неожиданные результаты:
На каждой итерации мы добавляем адрес
Новый вывод программы — это то, что ожидалось:
Строка
Хотя этот пример может показаться несколько очевидным, такое же неожиданное поведение может быть более скрытым в некоторых других случаях. Например, переменная цикла может быть массивом, а ссылка может быть срезом (пример справа). В результате получаем:
Использование ссылки на переменную итератора цикла
В Go переменная итератора цикла — это единственная переменная, которая принимает разные значения на каждой итерации цикла. Это очень эффективно, но может привести к непреднамеренному поведению при неправильном использовании. Смотрите пример слева, который выдаст неожиданные результаты:
Values: 3 3 3
Addresses: 0x40e020 0x40e020 0x40e020На каждой итерации мы добавляем адрес
i к срезу out, но поскольку это одна и та же переменная, мы добавляем тот же адрес, который в итоге содержит последнее значение, присвоенное i. Одно из решений — скопировать переменную цикла в новую переменную:for i := 0; i < 3; i++ {
i := i
out = append(out, &i)
}Новый вывод программы — это то, что ожидалось:
Values: 0 1 2
Addresses: 0x40e024 0x40e028 0x40e032Строка
i := i копирует переменную цикла i в новую переменную, ограниченную блоком тела цикла for, также называемым i. Адрес новой переменной — это тот, который добавляется к массиву. В каждой итерации цикла создается новая переменная.Хотя этот пример может показаться несколько очевидным, такое же неожиданное поведение может быть более скрытым в некоторых других случаях. Например, переменная цикла может быть массивом, а ссылка может быть срезом (пример справа). В результате получаем:
Values: [[3] [3] [3]]👍22
#tip #go
Типичная ситуация: пакет
В Go для создания и DI требуется три шага без каких-либо фреймворков. Примеры псевдокодом👇
1️⃣ Пакет
Определите интерфейс в пакете
2️⃣ Пакет
Определите тип, который реализует интерфейс.
Подключите хранилище при создании документа. Предположим, что у нас есть объект приложения в
Типичная ситуация: пакет
document не должен зависеть от пакета storage, но типу document.Doc нужен способ загрузки и сохранения содержимого.В Go для создания и DI требуется три шага без каких-либо фреймворков. Примеры псевдокодом👇
1️⃣ Пакет
documentОпределите интерфейс в пакете
document.type Storage interface {
Load(int) Content <i>// some content type</i>
Save(Content) int
}
Сделайте интерфейсную часть типа Doc, чтобы позже подключить фактическое хранилище.type Doc struct {
Cont Content
Store *Storage
}
Используйте этот интерфейс в функциях или методах, которые загружают или сохраняют содержимое документа.func (d *Doc) LoadById(id int, s Storage) {
d.Cont = d.Store.Load(id)
}
<i>// same for Save...</i>
2️⃣ Пакет
storageОпределите тип, который реализует интерфейс.
type DBStore struct {
db *database.DB
}
func (d *DBStore) Load(id int) Content {
<i>// ... load content by id</i>
}
<i>// same for Save...</i>
3️⃣ Пакет mainПодключите хранилище при создании документа. Предположим, что у нас есть объект приложения в
main.App.Doc.Store = storage.NewDBStore(...)🥱21🔥4👍3😁1🌚1
#tip #go #security
Два способа проверить свой код на наличие уязвимостей
📌Инструмент govulncheck, безусловно, является универсальным для сканирования репозиториев на наличие известных уязвимостей.
🔸Инструмент использует официальную базу данных уязвимостей Go vuln.go.dev, всеобъемлющий источник известных уязвимостей в общедоступных модулях Go.
🔸Govulncheck можно использовать в командной строке или как часть рабочего процесса CI.
📌Еще одним инструментом, заслуживающим внимания, является gosec: Golang Security Checker.
🔸gosec — CLI-инструмент, который может быть интегрирован в пайплайн CI. В дополнение к этому, gosec входит в состав golangci-lint.
🔸По умолчанию он отключен, и вы можете включить либо все проверки на уязвимости, либо только определенные из них. Таким образом, ваш код проверяется на наличие уязвимостей каждый раз, когда ваша IDE запускает линтер.
🔸В отличие от govulncheck, gosec не проверяет наличие известных уязвимостей в общедоступном коде Go. Скорее, он проверяет код на соответствие списку уязвимых шаблонов программирования, включая: жестко закодированные учетные данные, непроверенные ошибки, построение SQL-инструкций с использованием fmt и т.д.
Два способа проверить свой код на наличие уязвимостей
📌Инструмент govulncheck, безусловно, является универсальным для сканирования репозиториев на наличие известных уязвимостей.
🔸Инструмент использует официальную базу данных уязвимостей Go vuln.go.dev, всеобъемлющий источник известных уязвимостей в общедоступных модулях Go.
🔸Govulncheck можно использовать в командной строке или как часть рабочего процесса CI.
📌Еще одним инструментом, заслуживающим внимания, является gosec: Golang Security Checker.
🔸gosec — CLI-инструмент, который может быть интегрирован в пайплайн CI. В дополнение к этому, gosec входит в состав golangci-lint.
🔸По умолчанию он отключен, и вы можете включить либо все проверки на уязвимости, либо только определенные из них. Таким образом, ваш код проверяется на наличие уязвимостей каждый раз, когда ваша IDE запускает линтер.
🔸В отличие от govulncheck, gosec не проверяет наличие известных уязвимостей в общедоступном коде Go. Скорее, он проверяет код на соответствие списку уязвимых шаблонов программирования, включая: жестко закодированные учетные данные, непроверенные ошибки, построение SQL-инструкций с использованием fmt и т.д.
pkg.go.dev
govulncheck command - golang.org/x/vuln/cmd/govulncheck - Go Packages
Govulncheck reports known vulnerabilities that affect Go code.
👍6🔥1
🤩Вы, вероятно, слышали о gRPC, если еще не использовали её. Она особенно популярна для межсервисной связи благодаря своей эффективности, языковой независимости и встроенной поддержке таких вещей, как MTLS.
☝️Выше представлен простой пример начала работы с gRPC от Matt Boyle.
#go #tip
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍5
return early, return often
✅ Вместо глубоко вложенного кода, Go призывает разработчиков обрабатывать условия (особенно ошибки) и возвращать управление как можно скорее.
✅ Это делает код более читабельным и простым в сопровождении.
#go #tip by Matt Boyle
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍50🔥3💯2❤1
1️⃣Готовим иконку
$
magick convert icon.png -define icon:auto-resize=256,128,64,48,32,16 icon.ico$
convert icon_16.png icon_32.png icon_48.png icon_256.png -colors 256 icon.ico2️⃣Создаем файлы .syso
$
go install github.com/akavel/rsrc@latest$
rsrc -arch 386 -ico icon.ico$
rsrc -arch amd64 -ico icon.ico3️⃣Go автоматически выберет любой соответствующий файл .syso в каталоге пакета main и включит его в исполняемый файл, созданный для Windows
👉 Подробнее
#go #tip
Please open Telegram to view this post
VIEW IN TELEGRAM
hjr265.me
Adding Icons for Go-built Windows Executable
I have been using Windows for video games only for several years now. But that changed a little as I started working on Printd, Toph’s print server daemon.
An executable file (.exe) on Windows can provide its icons. If you build a Go program for Windows you…
An executable file (.exe) on Windows can provide its icons. If you build a Go program for Windows you…
👍17🤔4🔥2
Совет на 2025-й — будьте осторожнее с выбором работы.
IT-рынок штормит: массовые сокращения, заморозка найма, снижение зарплат. В такое время особенно важно отличать стоящие офферы от проходных.
Знакомо? Открываешь вакансию, а там: «Ищем middle-разработчика с опытом 10 лет, знанием 15 языков и готовностью работать за печеньки. Офис в Челябинске, релокация за ваш счет» 🤦♂️
Чтобы не тратить время на сотни сомнительных предложений, подпишитесь на IT Job Hub. Там мы отфильтровываем весь мусор и публикуем только избранные вакансии в стабильных компаниях:
— Зарплаты на уровне рынка, а не на уровне голодного студента
— Никаких «мы молодая и дружная семья» — только адекватные условия
— Проверенные работодатели, а не стартапы из сомнительных сфер
Вакансии удобно разбиты по тегам: #python #java #go #data #devops и по другим направлениям. Без воды и лишнего спама — только проверенные вакансии в знакомых компаниях.
Подписывайтесь, если не хотите упустить работу мечты → @proglib_jobs
IT-рынок штормит: массовые сокращения, заморозка найма, снижение зарплат. В такое время особенно важно отличать стоящие офферы от проходных.
Знакомо? Открываешь вакансию, а там: «Ищем middle-разработчика с опытом 10 лет, знанием 15 языков и готовностью работать за печеньки. Офис в Челябинске, релокация за ваш счет» 🤦♂️
Чтобы не тратить время на сотни сомнительных предложений, подпишитесь на IT Job Hub. Там мы отфильтровываем весь мусор и публикуем только избранные вакансии в стабильных компаниях:
— Зарплаты на уровне рынка, а не на уровне голодного студента
— Никаких «мы молодая и дружная семья» — только адекватные условия
— Проверенные работодатели, а не стартапы из сомнительных сфер
Вакансии удобно разбиты по тегам: #python #java #go #data #devops и по другим направлениям. Без воды и лишнего спама — только проверенные вакансии в знакомых компаниях.
Подписывайтесь, если не хотите упустить работу мечты → @proglib_jobs
👍1
🚀 Как ВКонтакте переобучает сотрудников на Go
ВКонтакте запустила масштабную технологическую трансформацию: соцсеть переходит на сервисную архитектуру с использованием Go.
Почему это важно?
— Go отлично подходит для высоконагруженных распределённых систем
— Простота синтаксиса и встроенный параллелизм
— Подходит для микросервисов
🔄 В компании сделали ставку на своих разработчиков: уже более 140 специалистов прошли внутреннюю программу переобучения с PHP на Go.
💡 Результат: плавный вход в новые архитектурные подходы, но с большей уверенностью и профессионализмом. Это не только смена языка, но и изменение майндсета — больше самостоятельности в принятии технических решений.
А вы бы согласились пройти переобучение на Go?
🐸 Библиотека Go-разработчика
#кейсы #go
ВКонтакте запустила масштабную технологическую трансформацию: соцсеть переходит на сервисную архитектуру с использованием Go.
Почему это важно?
— Go отлично подходит для высоконагруженных распределённых систем
— Простота синтаксиса и встроенный параллелизм
— Подходит для микросервисов
🔄 В компании сделали ставку на своих разработчиков: уже более 140 специалистов прошли внутреннюю программу переобучения с PHP на Go.
💡 Результат: плавный вход в новые архитектурные подходы, но с большей уверенностью и профессионализмом. Это не только смена языка, но и изменение майндсета — больше самостоятельности в принятии технических решений.
А вы бы согласились пройти переобучение на Go?
🐸 Библиотека Go-разработчика
#кейсы #go
👍34🥱25😢3🤔1