Получение именованных аргументов на вход

234 views
Skip to first unread message

Willgelm Tellurian

unread,
Mar 1, 2017, 7:02:22 AM3/1/17
to Golang Russian
Всем привет!
Товарищи, не подскажете, как получить в программе именованные параметры, подаваемые в командной строке?
типа ./myapp -d ~/test -a 10 -b 20
такого плана, чтобы не последовательностью аргументов руководствоваться, а их ключами, т.к. аргументов может и не быть
Чё-то не могу нагуглить сей вопрос )

ma...@kevac.org

unread,
Mar 1, 2017, 7:29:13 AM3/1/17
to Golang Russian
В стандартной поставке есть пакет flag: https://golang.org/pkg/flag/
Плюс в интернете есть еще несколько десятков вариаций, в том числе более GNU-like (тире с одной буквой, два тире со словом и т.п.).
Смотри, например, https://github.com/spf13/viper

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Willgelm Tellurian

unread,
Mar 1, 2017, 9:02:34 AM3/1/17
to Golang Russian
Спасибо за ответ.
Начал читать про стандартный пакет flag, чё-то не получается:
func main() {

 ip1
:= flag.String("f1", "str1", "подсказка")
 ip2
:= flag.String("f2", "str2", "подсказка")
 flag
.Parse()
 flagargs
:= len(flag.Args())
 fmt
.Println(flag.Args()) // возвращает []
 fmt
.Println(flagargs) // возвращает 0
 fmt
.Println(*ip1) //работает норм
 fmt
.Println(*ip2) //работает норм

}

Почему-то слайс flag.Args пуст ((

Не подскажете ещё вопрос - что за данные мы получим такой командой? fmt.Println(ip1)
выдаёт 0xc42006ee10
Я подобный вывод получаю в некоторых других командах и не понимаю, что с ним делать.

ma...@kevac.org

unread,
Mar 1, 2017, 9:46:00 AM3/1/17
to gola...@googlegroups.com
On Wed, Mar 1, 2017 at 5:02 PM Willgelm Tellurian <willgelm....@gmail.com> wrote:
Почему-то слайс flag.Args пуст ((

flag.Args содержит только те "куски", которые не были распознаны. Если вы передали только -f1 и -f2, то, соответственно, все было распознано.
 
Не подскажете ещё вопрос - что за данные мы получим такой командой? fmt.Println(ip1)
выдаёт 0xc42006ee10
Я подобный вывод получаю в некоторых других командах и не понимаю, что с ним делать.

Это указатели. Переменные ip1 и ip2 имеют тип указателей на строки.
Соответственно в fmt.Println(*ip1) вы разыменовываете указатель.
Чтобы получить не указатель, а именно строки, можно воспользоваться flag.StringVar.

Willgelm Tellurian

unread,
Mar 1, 2017, 10:47:07 AM3/1/17
to Golang Russian
Мда, чё-т тяжеловато golang идёт.
Читаю про flag.StringVar:

func StringVar

func StringVar(p *string, name string, value string, usage string)

StringVar defines a string flag with specified name, default value, and usage string. The argument p points to a string variable in which to store the value of the flag.


непонятно, как задавать p, откуда её брать
ip := make(map[string]string)
flag.StringVar("ipf1", "f1", "str1", "подсказка")
flag.StringVar(ipf2, "f2", "str2", "подсказка")
flag.Parse()
выдаёт ошибку 
./hello.go:14: cannot use "ipf1" (type string) as type *string in argument to flag.StringVar
./hello.go:15: undefined: ipf2

Cуществует какая-нибудь более вменяемая документация? не понятно ничего. Может, хоть с примерами..

Evgeniy Solomanidin

unread,
Mar 1, 2017, 11:15:31 AM3/1/17
to Golang Russian
https://play.golang.org/p/Sa8DVfxRld
Собственно нужно всего лишь посмотреть на то что принимает и возвращает та или иная функция в документации.

Andrey Velikoredchanin

unread,
Mar 1, 2017, 11:19:24 AM3/1/17
to golang-ru
Мне иногда помогает просмотр кода вызываемого метода. Когда документация не дает понимания.

1 марта 2017 г., 19:15 пользователь Evgeniy Solomanidin <evgeniyso...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+unsubscribe@googlegroups.com.

Willgelm Tellurian

unread,
Mar 1, 2017, 12:06:33 PM3/1/17
to Golang Russian
Большое всем спасибо!
После ваших объяснений, я понял, в чём проблема - я ещё до поинтеров не дошёл в изучении. Теперь всё понятно и всё работает.


On Wednesday, March 1, 2017 at 5:19:24 PM UTC+1, Andrey Velikoredchanin wrote:
Мне иногда помогает просмотр кода вызываемого метода. Когда документация не дает понимания.
1 марта 2017 г., 19:15 пользователь Evgeniy Solomanidin <evgeniyso...@gmail.com> написал:
https://play.golang.org/p/Sa8DVfxRld
Собственно нужно всего лишь посмотреть на то что принимает и возвращает та или иная функция в документации.


On Wednesday, March 1, 2017 at 3:02:22 PM UTC+3, Willgelm Tellurian wrote:
Всем привет!
Товарищи, не подскажете, как получить в программе именованные параметры, подаваемые в командной строке?
типа ./myapp -d ~/test -a 10 -b 20
такого плана, чтобы не последовательностью аргументов руководствоваться, а их ключами, т.к. аргументов может и не быть
Чё-то не могу нагуглить сей вопрос )

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages