interface {}를 문자열로 변환하는 방법은 무엇입니까?


114

docopt 를 사용하여 명령 줄 인수를 구문 분석하고 있습니다. 이것은 작동하며 다음과 같은 맵이 생성됩니다.

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

이제 두 값 사이에 콜론이있는 문자열에 값 hostport값 을 연결하고 싶습니다 . 기본적으로 다음과 같은 것입니다.

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

불행히도 오류 메시지가 표시되므로 작동하지 않습니다.

잘못된 작업 : arguments [ ""] + ":"(일치하지 않는 유형 인터페이스 {} 및 문자열)

그래서 분명히 맵에서 얻은 값 (단지 interface{}이므로 무엇이든 될 수 있음)을 문자열로 변환해야합니다. 이제 내 질문은 어떻게해야합니까?


답변:


153

유형 어설 션 을 추가해야합니다 .(string). 지도가 다음 유형이기 때문에 필요합니다 map[string]interface{}.

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

최신 버전의 Docopt는 변환 메서드 가있는 Opts 개체를 반환 합니다 .

host, err := arguments.String("<host>")
port, err := arguments.String("<port>")
host_port := host + ":" + port

7
이것을 Type Assertion-golang.org/ref/spec#Type_assertions라고 추가하고 싶습니다 . 이 정확한 용어를 이해하는 데 어려움이있었습니다.
Sreejith Ramakrishnan 2015 년

arguments [ "<host>"]가 nil 인 경우 패닉이 발생합니다
Savash

89

유형 어설 션을 사용할 필요가 없습니다. 대신 다음 %v과 함께 형식 지정자를 사용하십시오 Sprintf.

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

캐스트 interface {}를 문자열로 입력하려고 할 때 이것이 제가 작업 할 수있는 유일한 방법이었습니다.
FilBot3

1
나를 위해 이것은 작동하지 않았습니다. 이 201이 될처럼, 문자열 대신 바이트 ASCII 차트를 인쇄 결국 "[50,48,49]"나는 fmt.Sprintf ( "% S", theThing) 대신 ... 사용하여 결국 그렇게
펠리페 발데스

18

Peter가 말한 내용을 확장하려면 : interface {}에서 문자열로 이동하려고하므로 여러 수신 유형을 고려해야하므로 유형 어설 션은 골치 아픈 일이 될 것입니다. 가능한 각 유형을 주장하고 사용하기 전에 해당 유형인지 확인해야합니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.