Содержание
- Команды управления флагами i8086
- Флаги и их использование
- Флаги и их использование
- Крафт флага и нанесение линий
- Как сделать узоры на флаге
- Действия с регионами[]
- Как поставить приват в майнкрафте на сервере
- Как сделать цветной флаг в Майнкрафте
- Использование пакета Flag в Go
- Выделяем территорию
- Использование FlagSet для реализации субкоманд
Команды управления флагами i8086
Статья основана на материале xrnd с сайта asmworld (из учебного курса по программированию на ассемблер 16-битного процессора 8086 под DOS).
В предыдущей части учебного курса мы использовали флаг CF, чтобы вернуть из процедуры информацию об ошибке. Чтобы у вас сложилась полная картина, я решил в этой части подробнее рассказать о командах управления флагами.
Как вы, наверно, помните флаги изменяются в результате выполнения арифметических и логических команд, а также команд сдвига. Регистр флагов можно сохранить в стек с помощью команды PUSHF и восстановить из стека с помощью команды POPF. Кроме того, в процессоре существуют специальные команды, которые позволяют явно установить или сбросить флаги CF, DF и IF. Это очень простые команды: у них нет операндов и результатом является только изменение значения соответствующего флага.
Флаг переноса CF
Команда CLC сбрасывает флаг CF.
Команда STC устанавливает флаг CF в единицу.
Команда CMC инвертирует значение флага CF.
Флаг направления DF
Этот флаг определяет направление обработки данных цепочечными командами (о них подробно расскажу в отдельной статье). Он должен устанавливаться или сбрасываться перед использованием этих команд.
Команда CLD сбрасывает флаг DF.
Команда STD устанавливает флаг DF в единицу.
Флаг прерывания IF
Этот флаг определяет, разрешены в данный момент прерывания или нет (о прерываниях тоже будет отдельная статья).
Команда CLI сбрасывает флаг IF (запрещает прерывания).
Команда STI устанавливает флаг IF в единицу (разрешает прерывания).
Команды LAHF и SAHF
Команда LAHF загружает младший байт регистра флагов в AH. Её удобно использовать, когда нужно получить значения сразу нескольких флагов. Порядок расположения флагов представлен на рисунке:
Команда SAHF выполняет обратную операцию — загружает содержимое AH в младший байт регистра флагов. Это позволяет одновременно изменить значения нескольких флагов. При этом биты 1, 3, 5 регистра AH игнорируются.
Пример программы
В качестве примера использования команды LAHF я написал процедуру, которая получает и выводит на консоль значения флагов SF, ZF, AF, PF и CF. Подобную процедуру можно использовать в отладочных целях. Достаточно добавить её вызов в то место программы, где хочется проверить состояние флагов.
Чтобы выводить значения отдельных битов удобно написать отдельную процедурку для печати флага CF в виде символа. Нужный бит будет помещаться в флаг CF при помощи команды сдвига SHL.
А вот собственно процедура вывода флагов. Как видите, здесь нет ничего сложного Процедура сохраняет регистр флагов и восстанавливает его перед возвратом управления, поэтому можно вызывать её где угодно, не волнуясь, что она нарушит выполнение основной программы.
Полный исходный код примера:
Вывод программы выглядит так:
Упражнение
Чтобы потренироваться в работе с флагами напишите следующую программу. Вычислите сумму значений флагов CF, SF, ZF и выведите на консоль результат сложения. Если результат больше 1, инвертируйте значение флага CF.
Источник статьи: http://pro-prof.com/forums/topic/asm_i8086_22
Флаги и их использование
Чтобы активировать флаг надо написать в чате /region flag <название региона> <флаг> <значение переменной> Пример: /region flag(или же /rg f) <Название Региона> use deny (Отключение открытия дверей, кнопок, рычагов…), где «use» сам флаг (указаный в таблице снизу) «deny» значение переменной. Для разрешения флага используется параметр «allow», а для сброса — «none».
Вместо записи /region можно использовать /rg.
Флаги
Назначение
Значение по умолчанию
Тип переменной
passthrough
Используйте разрешено чтобы этот регион рассматривался как область, в которой отсутствует проверка флага build (используйте это, чтобы сделать простые no-PVP, и т. п
зоны).
Не Разрешено
State
build
Внимание! Рекомендуется не трогать этот флаг, поскольку его включение разрешит другим игрокам ломать блоки в вашем регионе.
Запрещено
State
pvp
Разрешает/запрещает PvP.
Разрешено (не работает на PvE серверах)
State
mob-damage
Разрешает мобам отнимать у вас здоровье (могут скинуть со скалы или кинуть в лаву).
Разрешено
State
mob-spawning
Разрешает спаун мобов.
Разрешено
State
creeper-explosion
Разрешает взрыв крипера (если отключено крипер вместо взрыва пропадет, или не нанесет ущерба постройкам).
Разрешено
State
enderman-grief
Разрешает страннику Края гриферить на вашей территории.
Разрешено
State
enderpearl
Разрешить или запретить использование Жемчуг Края
Разрешено
State
ghast-fireball
Разрешает урон от шаров гаста (так же как и крипера) .
Разрешено
State
sleep
Разрешить спать на кровати.
Разрешено
State
tnt
Разрешать взрыв ТНТ.
запрещено
State
lighter
Разрешить или запретить использование огнива.
Разрешено
State
fire-spread
Разрешить распространение огня.
Разрешено
State
lava-fire
Разрешает поджог от лавы.
Разрешено
State
lightning
Разрешить удар молнии.
Разрешено
State
chest-access
Запретить доступ к сундуку.
Запрещено
State
water-flow
Разрешить потоки воды
Разрешено
State
lava-flow
Разрешить потоки лавы
Разрешено
State
use
Разрешить использование кнопок, дверей, и т. п.
Разрешено
State
interact
Разрешить взаимодействовать с некоторыми предметами
Запрещено
State
vehicle-place
Разрешить размещение транспорта.
Разрешено
State
vehicle-destroy
Разрешение на удаление транспорта.
Запрещено
State
snow-fall
Разрешить выпадение снега.
Разрешено
State
leaf-decay
Разрешено
State
invincible
Временное бессмертие (приоритет операторской команды).
Запрещено
State
entry
Вход
Разрешено
State
exit
Выход.
Разрешено
State
exit-group
Выход группам.
Нет пользователей
Group
greeting
При входе в регион игрок видит в чате ваше пожелание «**Добро пожаловать, %name%.» голубым цветом.
String
farewell
Сообщение при выходе из региона
String
notify-enter
Показывать сообщение при входе в регион.
Запрещено
Boolean
notify-leave
Показывать сообщение при выходе из региона.
Запрещено
Boolean
deny-spawn
Запретить отдельным мобам спаун.
List
heal-delay
Скорость исцеления (установить частоту 1=1 сек.)
Не назначено
Integer
heal-amount
Исцеление здоровья (установить частоту 1=1 ())
Не назначено
Integer
teleport
Позволяет задать место для телепорта /region teleport
Не установлено
Location
spawn
Устанавливает место спауна: /region flag
Не установлено
Location
buyable
Не реализовано
Запрещено
Boolean
price
Устанавливает цену на регион (на серверах с валютой)
Не назначено
Double
blocked-cmds
Заблокировать указанные команды.
Не установлено
List
allowed-cmds
Запретить все команды кроме указанных (если делаете ловушку, оставьте команду /kill)
Не установлено
List
feed-min-hunger
Со скольки будет увеличиваться полоска голода в регионе.
Не установлено
Integer
feed-max-hunger
До скольки увеличится полоска голода в регионе (кормежка).
Не установлено
Integer
ice-form
Разрешение на формирование льда в регионе.
Не установлено
State
ice-melt
Разрешение на таяние льда
Не установлено
State
potion-splash
Разрешение на эффекты от взрывных зелий
Разрешено
State
pistons
Разрешить поршням двигать блоки
Разрешено
State
item-drop
Разрешить игрокам выбрасывать вещи
Разрешено
State
game-mode
Установить режим игры в регионе
Не установлено
State
send-chat
Разрешить писать в чат из региона
Не установлено
State
chorus-fruit-teleport
Запретить телепортацию через Хорус(1.9+)
Не установлено
State
ice-form
Разрешить или запретить формирование льда в регионе
Не установлено
State
ice-melt
Флаги и их использование
Чтобы активировать флаг надо написать в чате /region flag
<название региона> <флаг> <значение переменной>
значения пременной: »’allow(включать)»’, »’none(установить как по
умолчанию на сервере)»’, »’deny(отключить)»’ Пример:
/region flag Название Региона use deny (Отключение открытия дверей), где «use» сам флаг(указаный в табличке снизу) «deny» значение переменной.Пример2:
/rg flag Название региона use deny(Отключение открытие дверей, с сокращёным /region на /rg(тоже работает)).
Флаг | Назначение | Значение по-умолчанию | Тип переменной |
---|---|---|---|
passthrough | Используйте разрешено чтобы это регион рассматривался как область, в которой отсутствует проверка флага build (используйте это, чтобы сделать простые no-PVP, и т.п. зоны). |
N/A | State |
build | НЕ ТРОГАЙТЕ ЭТОТ ФЛАГ. Все будет нормально работать и без изменения этого флага. Этот флаг перекрывает все области проверки строительства, либо разрешить или запретить. Запретить всегда имеет преимущество перед разрешить. Если вы хотите просто защитить свой регион, не трогайте этот флаг. |
N/A | State |
pvp | Разрешает/запрещает PvP. | Разрешено (не работает на серверах с отключеным PvP) | State |
mob-damage | Разрешает мобам отнимать у вас здоровье (могут скинуть со скалы или кинуть в лаву). | Разрешено | State |
mob-spawning | Разрешает спавн мобов. | Разрешено | State |
creeper-explosion | Разрешает взрыв крипера (если отключено крипер вместо взрыва пропадет, или не нанесет ущерба постройкам. | Разрешено | State |
enderman-grief | Запрещает Endermany гриферить на вашей территории. | Разрешено | State |
ghast-fireball | Разрешает урон от шаров гаста (так же как и скипетра) . | Разрешено | State |
sleep | Разрешить спать на кровати. | Разрешено | State |
tnt | Разрешат взрыв тнт. | Разрешено | State |
lighter | Разрешить или блокировать использование огнива. | Разрешено | State |
fire-spread | Разрешить распространение огня. | Разрешено | State |
lava-fire | Разрешит поджог от лавы. | Разрешено | State |
lightning | Разрешить удар молнии. | Разрешено | State |
chest-access | Запретить доступ к сундук. | Запрещено | State |
water-flow | Разрешить потоки воды | Разрешено | State |
lava-flow | Разрешить потоки лавы | Разрешено | State |
use | Разрешить использование кнопок,и дверей т.п. | Разрешено | State |
vehicle-place | Разрешить размещение транспорта. | Разрешено | State |
vehicle-destroy | Разрешение на удаление транспорта. | Запрещено | State |
snow-fall | Разрешить выпадение снега. | Разрешено | State |
leaf-decay | Разрешить опадение листвы. | Разрешено | State |
invincible | Временное бессмертие (приоритет операторской команды). | Запрещено | State |
entry | Вход | Разрешено | State |
entry-group | Вход группам. | Нет пользователей | Group |
exit | Выход. | Разрешено | State |
exit-group | Выход группам. | Нет пользователей | Group |
greeting | При входе в регион игрок видит в чате ваше пожелание «**Добро пожаловать, %name%.» голубым цветом. | <нет надписи> | String |
farewell | Сообщение при выходе с региона | <нет надписи> | String |
notify-enter | Показывать сообщение при входе в регион. | Запрещено | Boolean |
notify-leave | Показывать сообщение при выходе из региона. | Запрещено | Boolean |
deny-spawn | Запретить отдельным мобам спавн. | <нет> | List |
heal-delay | Скорость исцеления (установить частоту 1=1 сек.) | Не назначено | Integer |
heal-amount | Исцеление здоровья (установить частоту 1=) | Не назначено | Integer |
teleport | Не реализовано | Не установлено | Vector |
teleport-group | Не реализовано | Не установлено | Group |
spawn | Не реализовано | Не установлено | Vector |
spawn-group | Не реализовано | Не установлено | Group |
buyable | Не реализовано | Запрещено | Boolean |
price | Устанавливает цену на регион (на серверах с валютой) | Не назначено | Double |
blocked-cmds | Заблокировать указанные команды. | Не установлено | List |
allowed-cmds | Запретить все команды кроме указанных (если делаете ловушку, оставьте команду /kill) | Не установлено | List |
feed-min-hunger | Minimum hunger the feed flags will drop a player to. | Не установлено | Integer |
feed-max-hunger | До скольки увеличится полоска голода в регионе (кормежка). | Не установлено | Integer |
ice-form | Разрешение на формирование льда в регионе. | Не установлено | State |
ice-melt | Разрешение на таяние льда | Не установлено | State |
Крафт флага и нанесение линий
Чтобы сделать флаг, откройте верстак и расставьте в верхнем и центральном ряду шесть блоков шерсти, а в нижнем деревянную палку посередине. В итоге один флаг будет готов.
Крафт белого флага.
Если вы будете использовать черную шерсть, то знамя будет тёмного цвета.
Покрасив шерсть можно можно добиться любого оттенка.
Для нанесения горизонтальных или вертикальных линий на знамя вам понадобится минимум три одинаковых красителя, например зелёный.
Чтобы нанести линию в середине, откройте верстак и разместите три зелёных красителя в нижнем ряду, а флаг по центру нижнего или верхнего ряда.
В итоге вы получите зелёную линию в середине. Таким же образом можно создавать и другие линии, просто меняйте взаимное расположение красителей и знамени. Красители всегда должны быть расположены на одной линии.
Для получения креста на флаге расставьте материалы в следующем порядке:
- Верхний ряд: краситель посередине и флаг с одного из боков;
- Средний ряд: три красителя;
- Нижний ряд: краситель посередине.
В итоге у вас получится флаг схожий со знаменем крестоносцев.
Подобным способом можно нарисовать перекрестие в середине, сплошные линии и разные геометрические фигуры, главное это правильно расставлять красители. Экспериментируйте.
Чтобы сделать ровную без узоров рамку на флаге вам потребуется восемь красителей, например лазурита. Расставить лазурит нужно вокруг знамени находящегося в центре панели верстака. Если вы собираетесь сделать узорчатую рамку, то просто поставьте флаг по центру верстака, а один пучок лиан сбоку.
Как сделать узоры на флаге
Начиная с Майнкрафт версии 1.14 для того, чтобы сделать узоры на флаге, изначально тебе понадобятся: ткацкий станок, флаг любого цвета и краситель отличный от цвета флага (в отдельных случаях — трафарет, для создания специальных флагов). Для версии игры ниже 1.14 все тот же список за исключением ткацкого станка.
Создание флага с узором для Майнкрафт версии 1.14 и выше
Рецепт крафта ткацкого станка прост — понадобятся две нити и две любые доски:
Ткацкий станок — это блок на подобие верстака, именно в нем мы и будем делать различные красивые узоры.
Базовые узоры
Разместив в верстаке флаг и краситель, нам станет доступен на выбор один из 32 базовых узоров:
Нажав ЛКМ на понравившийся узор мы предварительно можем увидеть как будет выглядеть флаг в правой верхней части ткацкого станка. Пока мы не забрали созданный флаг с правого нижнего угла, мы можем выбрать любой другой узор.
Таким образом, в ткацком станке можно сделать флаг с наложением друг на друга максимум 6 узоров, при этом используя как один краситель, так и каждый раз новый.
Узоры требующие трафарет
В Майнкрафт доступно создание 4 специальных флагов: “Цветок”, “Крипер”, “Череп”, “Нечто”, которые нуждаются в крафте трафарета — узор флага.
Для создания флага со специальным узором тебе понадобится бумага и один из предметов на выбор:
- нивяник (ромашка), для того чтобы сделать флаг с узором “Цветок”.Нивяник можно найти на равнинах, подсолнечниковых равнинах и в цветочном лесу;
- голова крипера для флага с узором “Крипер”. Получить голову крипера можно путем подрыва одного заряженного молнией крипера другого”;
- череп визер-скелета пригодится тебе если ты захочешь сделать флаг “Череп”.Этот блок можно получить если убить визер-скелета (встретить его можно в адской крепости в Аду), правда голова выпадет с небольшой вероятностью;
- зачарованное золотое яблоко для флага “Нечто”.Зачарованное золотое яблоко можно найти в натуральной генерации в сундуке пустынного храма, сокровищнице, в лесном особняке, шахте или же скрафтить самому из яблока и 8 золотых блока (правда крафт доступен только до версии игры 1.8).
Крафт бумаги прост, понадобится 3 сахарных тростника:
Также существую 2 узора которые можно встретить в натуральной генерации: “Морда” — в сундуках развалин бастиона, и “Глобус” — его можно купить у жителя картографа с уровнем Мастер (только в версии Java Edition, в Bedrock Edition такого узора нет). При крафте этих узоров и бумаги можно сделать такие крутые флаги:
Как создать флаг в Майнкрафт в версиях ниже 1.14
Узоры флага в Майнкрафт до версии 1.14 делаются в верстаке. Для создания узора необходим флаг любого цвета и краситель для узора. Те узоры, которые требуют трафарет в версиях Майнкрафт выше 1.14, по аналогии также создаются в верстаке.
Разноцветный флаг с узором создается путем выстраивания желаемого узора из красителей в верстаке
Размещения флага при этом не важно, но очень важно соблюдать размещение красителя, при этом нельзя создать узор, который не предусмотрен игрой
Всевозможные вариации можно найти на скриншотах ниже:
Действия с регионами[]
Узнать, как выделить регион, можно .
Чтобы проверить, занят ли блок каким-либо регионом, кликните по нему пером, кожей или палкой (предмет можно настроить в конфигурации, однако чаще всего используются именно эти).
- Доступные команды
- — создает регион и закрепляет за ним владельцев.
- — создаёт регион без начальных флагов. Помогает администрации, так как приватит поверх других регионов.
- — заменяет территорию региона на выделенную.
- — добавляет пользователя в регион.
- — добавляет владельца региона.
- — удаляет пользователя региона.
- — удаляет владельца региона.
- — устанавливает флаг на регион. Переменные: — не задана, — разрешено, — запрещено.
- — полностью удаляет регион.
- — уменьшает регион на заданное число от игрока (от вас)
Как поставить приват в майнкрафте на сервере
- Первым делом вам потребуется скачать и установить плагин, который позволяет редактировать карту. Одним из самых популярных плагинов, дающих такую возможность, является WorldEdit. С его помощью вы сможете строить текстуры, а также перемещать, копировать, удалять и добавлять блоки.
- Затем необходимо выделить территорию, которую вы хотите заприватить. Для этого пропишите в чат следующую команду://wand
- После этого вы обнаружите у себя в инвентаре топорик. Теперь постройте воображаемый куб, который будет обозначать границы территории, которую вы хотите сделать частной. С помощью левой кнопки мыши (при условии, что выданный топорик находится у вас в руках) обозначьте один из нижних углов воображаемого куба.
- Теперь нужно обозначить вторую точку, которая будет располагаться по диагонали внутри куба от первой обозначенной точки. После ее установки, все, что находится внутри воображаемой фигуры будет запривачено. Поздравляем, теперь вы знаете,как приватить территорию в minecraft на сервере, но это еще не всё.
Как сделать цветной флаг в Майнкрафте
Теперь ты знаешь, что в естественной среде можно встретить овец с белой, светло-серой, серой, черной, коричневой и розовой шерстью. Но как сделать флаг каким-либо другим цветом, если в Майнкрафт возможно сделать как минимум 16 флагов разных цветов? И что делать, если мы встречаем на своем пути только белых овец, ведь их вероятность встретить самая большая?
Для того чтобы получить не стандартный белый, а красивый цветной флаг у тебя есть несколько вариантов:
- искать одну из оставшихся 5 овец, вариация цветов которых не слишком богата, чтобы получить шерсть отличного от белого оттенка;
- окрасить белую шерсть любым из 15-ти красителей.
В погоне за овцами я тебе не помогу, а как получить классные красители — с радостью.
Большую их часть можно скрафтить из разных цветов и крафта других красителей между собой:
- черный краситель — получается путем крафта розы иссушения или чернильного мешка;
- красный краситель — для крафта понадобится один из ингредиентов на выбор: свекла, мак, красный тюльпан или розовый куст;
- коричневый краситель — какао-бобы;
- синий краситель — крафт василька или лазурита;
- фиолетовый краситель — необходим один синий краситель + красный краситель;
- бирюзовый краситель — крафт синего красителя и кактусовой зелени;
- светло-серый краситель — крафт одного черного красителя и двух белых или серого красителя с белым, или белого тюльпана, или нивяника, или же хаустонии серой;
- серый краситель — смесь белого и черного красителя;
- розовый краситель — можно получить путем крафта белого и красного красителя, либо из цветков пиона или розового тюльпана;
- лаймовый краситель — создается путем слияния кактусовой зелени и белого красителя;
- желтый краситель — понадобится одуванчик или подсолнечник;
- светло-синий краситель — белый и синий краситель, либо цветков синей орхидеи;
- сиреневый краситель — сирень или лук (цветок), либо фиолетовый + розовый краситель, или синий + красный + розовый, или синий + два белых + красный краситель;
- оранжевый краситель — понадобится оранжевый тюльпан, либо красный и желтый краситель;
- белый краситель — крафт костной муки или ландыша.
После того как ты получил необходимый тебе цвет, можешь окрасить им шерсть в верстаке, например, я крашу белую шерсть в фиолетовую:
Имея в арсенале все предметы, переходи к крафту красивого цветного флага в верстаке:
Таким образом, из белой шерсти и любого, из 15 красителей, ты можешь создать однотонный цветной флаг.
А как получить неограниченное количество цветной шерсти используя минимум красителей читай в статье о ножницах в Майнкрафт.
Использование пакета Flag в Go
Введение
Утилиты командной строки редко можно использовать в готовом виде без дополнительной настройки. Хорошие значения по умолчанию очень важны, однако полезные утилиты должны принимать конфигурацию от пользователей. В большинстве платформ утилиты командной строки принимают флаги для настройки выполнения команд. Флаги — это ограниченные значениями ключей строки, добавляемые после имени команды. Go позволяет настраивать утилиты командной строки, принимающие флаги посредством пакета flag из стандартной библиотеки.
В этом обучающем руководстве мы покажем различные способы использования пакета flag для построения различных видов утилит командной строки. Флаги используются для контроля вывода программы, ввода аргументов позиционирования с сочетанием флагов и других данных, а также для реализации субкоманд.
Выделяем территорию
Выделить участок можно несколькими способами. Самый распространенный – это с использованием топора. При этом его не обязательно создавать, можно просто прописать в чате команду;
Далее нужно выделить две точки. Если провести аналогию с параллелепипедом, то точки должны соединять его диагональ.
Левой кнопкой мыши сначала отмечаем самую нижнюю точку вашей территории. Если координаты появились, значит вы все сделали правильно. Далее нужно отметить самую высокую точку. Переместите персонажа в нужное место и поднимайтесь на необходимую высоту и правой кнопкой мыши отмечаете вторую точку.
Можно не выбирать самые высокие или низкие точки, а отметить те, которые находятся на одной высоте. После этого в чате прописать две команды:
Первая команда отмечает высоту 20-ти кубов вниз, вторая соответственно высоту 20-ти кубов вверх.Число кубов можно менять по своему желанию. Это избавит от построения высоких столбов и рытья глубоких ям.
Может возникнуть вопрос, зачем отмечать территорию, которая уходит вглубь или находится наверху. Ведь на ней нет никаких построек. Это делается для того, чтобы злые игроки не смогли навредить вам, например, залив всю территорию лавой или не сделали подкоп и не добрались до ваших сундуков.
Следующий способ, схож с предыдущим. Только вместо топора мы будем использовать команды. Также нужно встать в самую нижнюю точку своей территории и в чате прописать команду;
Далее перемещаем своего персонажа к самой высокой точке и пишем;
Также можно использовать команды;
Они отмечают точки, на которые смотрит персонаж. То есть, куда направлен крестик в середине экрана.
Самое главное, не забывать, что территория приватится наискосок. Если вы выделите точками прямую линию, то заприватится только то, что находится между двумя этими точками.
Использование FlagSet для реализации субкоманд
В современных приложениях командной строки часто реализуются субкоманды, что позволяет объединить набор инструментов в одной команде. Самый известный инструмент, использующий такую схему, называется git . При проверке такой команды как git init командой является git , а init является субкомандой git . Важная характеристика субкоманд заключается в том, что каждая субкоманда может иметь собственный набор флагов.
Приложения Go могут поддерживать субкоманды с собственным набором флагов, используя оператор типа flag.( *FlagSet) . Для иллюстрации мы создадим программу, которая будет реализовать команду, используя две субкоманды с разными флагами.
Создайте новый файл с именем subcommand.go и добавьте в него следующий код:
Эта программа разделена на несколько частей: функция main , функция root и отдельные функции для реализации субкоманды. Функция main обрабатывает ошибки, возвращаемые командами. Если любая функция возвращает ошибку, выражение if определит ее, распечатает ошибку и закроет программу с кодом состояния 1 , сообщающим операционной системе о возникновении ошибки. Внутри функции main мы передаем все аргументы вызова программы в функцию root . Удалим первый аргумент, представляющий собой имя программы (в предыдущих примерах ./subcommand ), выделив срез os.Args.
Функция root определяет []Runner , где определяются все субкоманды. Runner — это интерфейс субкоманд, позволяющий функции root получить имя субкоманды с помощью Name() и сравнить его с содержанием переменной subcommand . После обнаружения правильной субкоманды посредством итерации переменной cmds мы инициализируем субкоманду с остальными аргументами и вызываем метод Run() для этой команды.
Мы определяем только одну субкоманду, хотя данная структура позволяет легко создавать и другие команды. Экземпляр GreetCommand создается с помощью NewGreetCommand при создани нового *flag.FlagSet с помощью flag.NewFlagSet . flag.NewFlagSet принимает два аргумента: имя набора флагов и стратегию отчета об ошибках проверки синтаксиса. Имя *flag.FlagSet доступно с помощью flag.( *FlagSet). Метод Name. Мы используем этот метод в (*GreetCommand). Name() так, что имя субкоманды соответствует имени, которое мы присвоили *flag.FlagSet . NewGreetCommand также определяет флаг -name аналогично предыдущим примерам, но вместо этого вызывает его как метод поля *flag.FlagSet *GreetCommand , gc.fs . Когда функция root вызывает метод Init() команды *GreetCommand , мы передаем указанные аргументы методу Parse поля *flag.FlagSet .
Субкоманды будет проще увидеть, если вы соберете эту программу и запустите ее. Выполните сборку программы:
Теперь запустите программу без аргументов:
Вы увидите следующий результат:
Теперь запустите команду с субкомандой greet :
Результат будет выглядеть следующим образом:
Теперь используйте флаг -name с greet для указания имени:
Программа выведет следующее:
В этом примере проиллюстрированы некоторые принципы структурирования больших приложений командной строки в Go. Наборы FlagSet разработаны так, чтобы дать разработчикам больше контроля над местом и способом обработки флагов логикой синтаксической проверки флагов.