Làm cách nào để chuyển đổi giao diện {} thành chuỗi?


114

Tôi đang sử dụng docopt để phân tích cú pháp các đối số dòng lệnh. Điều này hoạt động và nó dẫn đến một bản đồ, chẳng hạn như

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

Bây giờ tôi muốn nối giá trị hostportgiá trị vào một chuỗi có dấu hai chấm ở giữa hai giá trị. Về cơ bản, một cái gì đó chẳng hạn như:

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

Rất tiếc, điều này không hoạt động, vì tôi nhận được thông báo lỗi:

hoạt động không hợp lệ: đối số [""] + ":" (giao diện loại không khớp {} và chuỗi)

Vì vậy, rõ ràng là tôi cần chuyển đổi giá trị mà tôi nhận được từ bản đồ (chính là interface{}, vì vậy nó có thể là bất kỳ thứ gì) thành một chuỗi. Bây giờ câu hỏi của tôi là, làm thế nào để làm điều đó?


Câu trả lời:


153

Bạn cần thêm xác nhận loại .(string) . Nó là cần thiết vì bản đồ thuộc loại map[string]interface{}:

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

Phiên bản mới nhất của Docopt trả opts đối tượng đó có phương pháp để chuyển đổi:

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

7
Tôi muốn nói thêm rằng điều này được gọi là Type Assertion - golang.org/ref/spec#Type_assertions . Tôi đã từng gặp khó khăn khi tìm ra thuật ngữ chính xác này.
Sreejith Ramakrishnan

Nó sẽ gây ra một sự hoảng sợ nếu các đối số ["<host>"] là 0
Savash

89

Bạn không cần sử dụng xác nhận kiểu, thay vào đó chỉ cần sử dụng %vxác định định dạng với Sprintf:

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

Đây là điều duy nhất tôi có thể làm việc cho mình khi cố gắng nhập giao diện truyền của {} với dưới dạng chuỗi.
FilBot3

1
Đối với tôi, điều này không hiệu quả. Điều này đã kết thúc việc in các biểu đồ ASCII byte thay vì chuỗi, như 201 trở thành "[50,48,49]", vì vậy tôi đã kết thúc bằng cách sử dụng fmt.Sprintf ("% s", theThing) thay thế ...
Felipe Valdes

18

Để mở rộng điều Peter đã nói: Vì bạn đang tìm cách chuyển từ giao diện {} sang chuỗi, việc xác nhận kiểu sẽ khiến bạn đau đầu vì bạn cần tính đến nhiều kiểu đến. Bạn sẽ phải xác nhận từng loại có thể và xác minh đó là loại đó trước khi sử dụng.

Sử dụng fmt.Sprintf ( https://golang.org/pkg/fmt/#Sprintf ) tự động xử lý chuyển đổi giao diện. Vì bạn biết loại đầu ra mong muốn của mình luôn là một chuỗi, Sprintf sẽ thay mặt bạn xử lý bất kỳ loại nào nằm sau giao diện mà không cần thêm một loạt mã.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.