{} Arayüzü nasıl dizeye dönüştürülür?


114

Komut satırı bağımsız değişkenlerini çözümlemek için docopt kullanıyorum . Bu çalışır ve aşağıdaki gibi bir harita ile sonuçlanır:

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

Şimdi hostve portdeğerini, iki değer arasında iki nokta üst üste bulunan bir dizeye birleştirmek istiyorum . Temel olarak, aşağıdaki gibi bir şey:

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

Ne yazık ki hata mesajını aldığım için bu işe yaramıyor:

geçersiz işlem: bağımsız değişkenler [""] + ":" (eşleşmeyen türler arabirimi {} ve dize)

Açıkçası, haritadan aldığım değeri (ki bu sadece interface{}herhangi bir şey olabilir) bir dizeye dönüştürmem gerekiyor. Şimdi sorum şu, bunu nasıl yapacağım?


Yanıtlar:


153

Tür iddiası eklemeniz gerekiyor .(string). Harita şu türden olduğu için gereklidir map[string]interface{}:

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

Docopt son versiyonu döner seçmesi dönüştürülmesi için yöntemleri vardır nesne:

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

7
Bunun Type Assertion - golang.org/ref/spec#Type_assertions olarak adlandırıldığını eklemek isterim . Bir zamanlar bu kesin terminolojiyi bulmakta zorlandım.
Sreejith Ramakrishnan

["<host>"] bağımsız değişkenlerinin sıfır olması paniğe neden olur
Savash

89

Bir tür iddiası kullanmanıza gerek yoktur, bunun yerine %vformat belirticisini şu şekilde kullanın Sprintf:

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

Bu, dizeler olarak cast arabirimi {} 'leri yazmaya çalışırken benim için çalışabileceğim tek şeydi.
FilBot3

1
Benim için bu işe yaramadı. Bu, dizi yerine bayt ASCII çizelgelerinin yazdırılmasıyla sonuçlandı, örneğin 201 "[50,48,49]" haline geldi, bu yüzden fmt.Sprintf ("% s", theThing) kullanmaya başladım ...
Felipe Valdes

18

Peter'ın söylediği şeyi genişletmek gerekirse: {} arayüzünden dizgeye geçmek istediğiniz için, birden çok gelen türü hesaba katmanız gerektiğinden, tür iddiası baş ağrısına yol açacaktır. Kullanmadan önce mümkün olan her türü doğrulamanız ve bu tür olduğunu doğrulamanız gerekir.

Fmt.Sprintf ( https://golang.org/pkg/fmt/#Sprintf ) kullanmak arayüz dönüşümünü otomatik olarak yönetir. İstediğiniz çıktı türünün her zaman bir dizge olduğunu bildiğiniz için, Sprintf sizin adınıza fazladan kod olmadan arabirimin arkasında ne tür olursa olsun işleyecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.