Używam docopt do analizowania argumentów wiersza polecenia. To działa i powoduje powstanie mapy, takiej jak
map[<host>:www.google.de <port>:80 --help:false --version:false]
Teraz chciałbym, aby złączyć host
a port
wartość ciągu z dwukropkiem w między tymi dwiema wartościami. Zasadniczo coś takiego jak:
host := arguments["<host>"] + ":" + arguments["<port>"]
Niestety to nie działa, ponieważ pojawia się komunikat o błędzie:
nieprawidłowa operacja: argumenty [""] + ":" (interfejs niezgodnych typów {} i ciąg znaków)
Więc oczywiście muszę przekonwertować wartość, którą otrzymuję z mapy (która jest po prostu interface{}
, więc może to być cokolwiek) na ciąg. Teraz moje pytanie brzmi, jak mam to zrobić?
Odpowiedzi:
Musisz dodać potwierdzenie typu
.(string)
. Jest to konieczne, ponieważ mapa jest typumap[string]interface{}
:Najnowsza wersja Docopt zwraca obiekt Opts, który ma metody konwersji:
źródło
Nie musisz używać potwierdzenia typu, zamiast tego użyj specyfikatora
%v
formatu zSprintf
:źródło
Aby rozwinąć to, co powiedział Peter: Ponieważ chcesz przejść od interfejsu {} do ciągu znaków, asercja typu doprowadzi do bólu głowy, ponieważ musisz uwzględnić wiele typów przychodzących. Będziesz musiał potwierdzić każdy możliwy typ i sprawdzić, czy jest to ten typ, zanim go użyjesz.
Korzystanie z fmt.Sprintf ( https://golang.org/pkg/fmt/#Sprintf ) automatycznie obsługuje konwersję interfejsu. Ponieważ wiesz, że pożądanym typem wyjściowym jest zawsze ciąg, Sprintf obsłuży każdy typ za interfejsem bez dodatkowego kodu w Twoim imieniu.
źródło