[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는 사용자를 대신하여 추가 코드없이 인터페이스 뒤에있는 모든 유형을 처리합니다.


답변


댓글 달기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다