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

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

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

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

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

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

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

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



답변

유형 어설 션 을 추가해야합니다 .(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


답변

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

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


답변

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

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


답변