LINUX.ORG.RU

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

 


0

3

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

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

А не нужно на нем драйвера писать. Ты бы еще на Питон этот батон покрошил.

urxvt ★★★★★
()

Есть build tags, но они позволяют выбрать конпилировать весь модуль целиком или нет.

Ну так вынеси код фичи в отдельный модуль. В чём проблема?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ты можешь внятно проблему описать?

Я тебе уже её описал :)))

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

А есть способ проверить наличие тега через функцию? Вот без этого:

// build myfeature

package foo

import (
	"example.com/internal/app"
)

func init() {
	app.Features["myfeature"] = true
}

[...]
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)
Ответ на: комментарий от vbr

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

Да, это ровно то что нужно. Спасибо.

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

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

Снимаем с себя корону и пишем.

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

Так не пиши. Нормальные люди от go держатся подальше.

На полно годных проектов. Меня просто бесит фанатичный аскетизм.

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

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

firkax ★★★★★
()

А unifdef ему в сборку нельзя вкрячить? (Го я мимокрокодил, просто обычно втыкаю его туда, где нет условной компиляции.)

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

Я не хочу костылять сбоку, потому что сломаются все тулзы для LSP.

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

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

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

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

CNCF

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

Kubernetes и все около

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

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

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

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

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

Условная компиляция в вебсервисах не особо-то и используется, обычно это рантайм конфигурация

ac130kz ★★
()

помню, пришлось разок для языка без поддержки препроцессора для условной сборки прикручивать M4.

Было весело.

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

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

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

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

Таки да, но по нормальному можно просто сделать два отдельных файла:

// +build feature-enabled

func Feature() {
        println("feature")
}

// +build !feature-enabled

func Feature() {
        // NOP
}

urxvt ★★★★★
()
15 января 2024 г.
Ответ на: комментарий от vbr

Программист С++ на любом языке напишет программу на С++. Ну или хотя бы попытается.

LongLiveUbuntu ★★★★★
()

Потому что для платформонезависимого используй нормальные feature gate, а не вот это вот ублюдочное порождение былых времён.

А если платформозависимое - так распили на модули, как положено.

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

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

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

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

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

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

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

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

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

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

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

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

cumvillain
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.