2014-11-25 28 views
35

Komut satırı bağımsız değişkenlerini ayrıştırmak için docopt kullanıyorum. Bu çalışıyor ve Şimdi host ve iki değer arasındaki in-iki nokta içeren bir dizeye port değerini bitiştirmek istiyorumArabirim {} dizgiye nasıl dönüştürülür?

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

gibi, bir harita ile sonuçlanır.

geçersiz operasyon: argümanlar [ ""] + ":" (uyumsuz türleri arayüzü Temelde, bir şey gibi: Ben hata mesajı alır almaz

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

Ne yazık ki bu, işe yaramaz {} ve dize)

Yani belli ben sadece interface{} olduğunu harita (elde ettiğiniz değere dönüştürmek gerekir, bu yüzden bir dizeye şey) olabilir. Şimdi sorum şu, bunu nasıl yaparım?

+6

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

cevap

51

type assertion.(string)'u eklemeniz gerekir. haritası tip map[string]interface{} ait olduğu için gereklidir:

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

Buna buna Tür Onaylama - https://golang.org/ref/spec#Type_assertions - eklemek denebilir. Bir keresinde bu terminolojiyi bulmakta zorlandım. –

33

yerine sadece Sprintf ile %v Biçim belirteci kullanabilir, bir tür iddiayı kullanmaya gerek yoktur:

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

Bunu işaret ettiğin için teşekkürler :-) –

+0

Bu benim için çalışabildiğim tek şey, "cast interface {}" in dizeleriyle yazmayı denerken. – Pred

7

üzerine genişletmek için neler Peter dedi ki: Arayüzden {} dizgeye gitmek istediğiniz için, birden fazla gelen türü hesaba katmanız gerektiğinden, assertion baş ağrısına yol açacaktır. Mümkün olan her türü iddia etmeniz ve kullanmadan önce bu tür olduğunu doğrulamanız gerekir.

fmt.Sprintf kullanımı (https://golang.org/pkg/fmt/#Sprintf), otomatik olarak arabirim dönüştürmeyi gerçekleştirir. İstediğiniz çıktı türünün her zaman bir dize olduğunu bildiğinizden, Sprintf sizin adınıza herhangi bir türden fazla kod olmaksızın arabirimin arkasında ne tür bir işlem yapacaktır.