2014-11-25 3 views
35

docopt을 사용하여 명령 줄 인수를 구문 분석합니다. 이 작품, 그리고 지금은 host 두 값 사이에-콜론 문자열로 port 값을 연결하려는인터페이스 {}을 (를) 문자열로 변환하는 방법은 무엇입니까?

map[<host>:www.google.de <port>:80 --help:false --version:false] 

등,지도 발생합니다.

잘못된 작업 : 인수 [ ""] + ":"(일치하지 않는 유형의 인터페이스를 기본적으로, 뭔가 같은 : 나는 오류 메시지로

host := arguments["<host>"] + ":" + arguments["<port>"] 

불행하게도,이 작동하지 않습니다 {} 및 문자열)

그래서 분명히지도에서 값을 변환해야합니다 (이것은 단지 interface{}이므로 문자열 일 수 있습니다). 이제 제 질문은, 어떻게해야합니까?

+6

https://golang.org/ref/spec#Type_assertions – twotwotwo

답변

51

type assertion.(string)을 추가해야합니다. 지도 유형 map[string]interface{}입니다 때문에 필요하다 :

host := arguments["<host>"].(string) + ":" + arguments["<port>"].(string) 
+5

이것을 유형 주장 (https://golang.org/ref/spec#Type_assertions)이라고 추가하고 싶습니다. 나는이 정확한 용어를 알아내는 데 어려움을 겪었습니다. –

33

당신은 대신 Sprintf으로 %v 형식 지정자를 사용, 유형 주장을 사용할 필요가 없습니다 :

hostAndPort := fmt.Sprintf("%v:%v", arguments["<host>"], arguments["<port>"]) 
+0

이것을 지적 해 주셔서 감사합니다 :-) –

+0

문자열을 사용하여 캐스팅 인터페이스 {}를 입력하려고 할 때 이것이 저에게 작용할 수있는 유일한 방법이었습니다. – Pred

7

을 확장하기 위해 무엇을 Peter는 다음과 같이 말했습니다. 인터페이스 {}에서 문자열로 이동하려는 경우 여러 수신 유형을 고려해야하기 때문에 assertion을 입력하면 두통이 발생합니다. 가능한 각 유형을 주장해야하며 사용하기 전에 해당 유형인지 확인해야합니다.

fmt.Sprintf (https://golang.org/pkg/fmt/#Sprintf)를 사용하면 인터페이스 변환이 자동으로 처리됩니다. 원하는 출력 유형이 항상 문자열이라는 것을 알고 있기 때문에 Sprintf는 사용자를 대신하여 여분의 코드없이 인터페이스 뒤의 모든 유형을 처리합니다.

관련 문제