LINUX.ORG.RU

А как вы живете без нормальной условной компиляции в Golang?

 


0

3

Я захотел сделать фичу опциональной, и тут внезапно выяснилось, что голанг не может в нормальную условную конпиляцию. Есть build tags, но они позволяют выбрать конпилировать весь модуль целиком или нет. Если ты хочешь в одном месте сделать что-то похожее на cfg!() макрос из rust, то нет, так нельзя, это слишком сложно.

Как вы вообще на этом убогом недоязычке что-то пишете?

Ответ на: комментарий от cumvillain

Я спрашиваю зачем тебе это понадобилось.

Очевидно, что если на Го написали компилятор работающий под множеством архитектур и ОС то живут там нормально.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Да там не модуль, но сам не разобрался.

На самом деле, лучше это модулями разрулить и экспортировать из них одинаковые интерфейсы (функции, типы). Потому что когда в одном модуле лапша из #ifdef или аналогов, это выглядит чудовищно.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Ну это да. Я имел ввиду то что в Го называется модулем или даже пакетом. Так то там твой подход достаточно удобно реализован: можно просто создать отдельный файл (например. *_windows.go) для ОС и он подхватится на нужной платформе.

urxvt ★★★★★
()
Последнее исправление: urxvt (всего исправлений: 1)
Ответ на: комментарий от vbr

Просто if поставь и голову не морочь. Те, кто на го пишет, не придумывают себе проблемы.

Да-да, я уже нашел что это делают через init() и отдельный hashmap с булевым списком. Но это странно.

cumvillain
() автор топика
Ответ на: комментарий от cumvillain

Насчёт тега не знаю. Можешь линкером через параметр -X поменять значение глобальной переменной и потом в рантайме это значение узнавать. Но как ты написал - наверное лучше, это я так, для полноты добавил.

https://www.reddit.com/r/golang/comments/k7t31k/checking_for_build_tag_at_runtime/

Тут чел написал:

Also, just discovered that with go1.18, runtime/debug now has a Settings attribute from the BuildInfo, which contains the tags used to build the binary.

tag name is ‘-tags’ and looks like a list of tags.

Мне лень проверять, может тебе это тоже подойдёт.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 2)
Ответ на: комментарий от firkax

если у кого-то получилось - лучше не ввязываться

Почти все проекты CNCF на нем, Kubernetes и все около, и еще много чего. На Go написано много хорошего и активно используюшегося.

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

CNCF

Пришлось открывать яндекс чтобы узнать что это.

Kubernetes и все около

Вот это всё докеробесие как раз и ненужно. Хоть и популярно, но так часто случается (самый яркий пример это оффтопик).

firkax ★★★★★
()
Ответ на: комментарий от firkax

Вот это всё докеробесие как раз и ненужно. Хоть и популярно, но так часто случается (самый яркий пример это оффтопик).

aerc, senpai, fzf, packer, vault, hugo, wireguard(!) для макоси. Да сотни.

cumvillain
() автор топика
Ответ на: комментарий от cumvillain

Я насколько помню компиллер go выкидывает мертвый код, так что если у тебя бранчинг тестирует константы уровня компиляции то ложных ветвей не будет в бинарниках.

Updated: таки да https://segflow.github.io/post/go-compiler-optimization/

Aber ★★★★★
()
Последнее исправление: Aber (всего исправлений: 1)
15 января 2024 г.
Ответ на: комментарий от Dark_SavanT

а не вот это вот ублюдочное порождение былых времён

Это ублюдочное порождение гораздо удобнее. Поэтому в rust это делается легко и просто:

#[cfg(foo)]
{
    do_foo();
}

#[cfg(bar)]
{
    do_bar();
}

Просто гогланг не может. Но он столько всего не может, что проще оказалось реально взять раст.

cumvillain
() автор топика
Ответ на: комментарий от cumvillain

Скажем так, вот это вот всё - только проблемы потом вызывает. Все эти условные и безусловные фичи. Напихают говна в крейт, а потом подбирай нужный набор, мол это хочу, это не хочу.

В общем, если тебе нужна условная компиляция внутри файла, чтобы добавлять вариативность - ты что-то делаешь не так.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

В общем, если тебе нужна условная компиляция внутри файла, чтобы добавлять вариативность - ты что-то делаешь не так.

Я понимаю что могу нагородить целый фрейморк на интерфейсах и очередях чтобы подключить функцию, но это какая-то наркомания.

cumvillain
() автор топика