Bagaimana cara mengonversi antarmuka {} menjadi string?

114

Saya menggunakan docopt untuk mengurai argumen baris perintah. Ini berfungsi, dan itu menghasilkan peta, seperti

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

Sekarang saya ingin menggabungkan nilai hostdan portke string dengan titik dua di antara dua nilai. Pada dasarnya, sesuatu seperti:

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

Sayangnya, ini tidak berhasil, karena saya mendapatkan pesan kesalahan:

operasi tidak valid: argumen [""] + ":" (jenis antarmuka {} dan string tidak cocok)

Jadi jelas saya perlu mengubah nilai yang saya dapatkan dari peta (yang mana saja interface{}, jadi bisa apa saja) menjadi string. Sekarang pertanyaan saya adalah, bagaimana cara melakukannya?

Golo Roden
sumber

Jawaban:

153

Anda perlu menambahkan pernyataan tipe .(string) . Ini diperlukan karena peta berjenis map[string]interface{}:

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

Versi terbaru Docopt mengembalikan objek Opts yang memiliki metode untuk konversi:

host, err := arguments.String("<host>")
port, err := arguments.String("<port>")
host_port := host + ":" + port
Grzegorz Żur
sumber
7
Ingin menambahkan bahwa ini disebut Type Assertion - golang.org/ref/spec#Type_assertions . Saya pernah mengalami kesulitan untuk memahami terminologi yang tepat ini.
Sreejith Ramakrishnan
Ini akan menyebabkan kepanikan jika argumen ["<host>"] nihil
Savash
89

Anda tidak perlu menggunakan pernyataan tipe, cukup gunakan %vpenentu format dengan Sprintf:

hostAndPort := fmt.Sprintf("%v:%v", arguments["<host>"], arguments["<port>"])
Peter Stace
sumber
Ini adalah satu-satunya hal yang bisa saya kerjakan untuk saya saat mencoba mengetik antarmuka cast {} dengan sebagai string.
FilBot3
1
Bagi saya, ini tidak berhasil. Ini akhirnya mencetak grafik ASCII byte alih-alih string, seperti 201 menjadi "[50,48,49]", jadi saya akhirnya menggunakan fmt.Sprintf ("% s", theThing) sebagai gantinya ...
Felipe Valdes
18

Untuk memperluas apa yang dikatakan Peter: Karena Anda ingin beralih dari antarmuka {} ke string, pernyataan tipe akan menyebabkan sakit kepala karena Anda perlu memperhitungkan beberapa tipe yang masuk. Anda harus menegaskan setiap jenis mungkin dan memverifikasi itu adalah jenis itu sebelum menggunakannya.

Menggunakan fmt.Sprintf ( https://golang.org/pkg/fmt/#Sprintf ) secara otomatis menangani konversi antarmuka. Karena Anda tahu jenis keluaran yang Anda inginkan selalu berupa string, Sprintf akan menangani jenis apa pun yang ada di belakang antarmuka tanpa banyak kode tambahan atas nama Anda.

justitan
sumber