จะแปลงอินเทอร์เฟซ {} เป็นสตริงได้อย่างไร


115

ฉันใช้docoptเพื่อแยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่ง วิธีนี้ใช้งานได้และส่งผลให้เกิดแผนที่เช่น

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

ตอนนี้ฉันต้องการเชื่อมต่อค่าhostและportค่าเข้ากับสตริงโดยมีโคลอนอยู่ระหว่างค่าทั้งสอง โดยทั่วไปบางสิ่งเช่น:

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

ขออภัยไม่ได้ผลเนื่องจากฉันได้รับข้อความแสดงข้อผิดพลาด:

การดำเนินการที่ไม่ถูกต้อง: อาร์กิวเมนต์ [""] + ":" (อินเทอร์เฟซประเภทที่ไม่ตรงกัน {} และสตริง)

เห็นได้ชัดว่าฉันต้องแปลงค่าที่ได้รับจากแผนที่ (ซึ่งเป็นเพียงinterface{}เพื่อให้เป็นอะไรก็ได้) เป็นสตริง ตอนนี้คำถามของฉันคือฉันจะทำอย่างไร?


คำตอบ:


155

คุณต้องเพิ่มประเภทการยืนยัน .(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

7
ต้องการที่จะเพิ่มที่นี้จะเรียกว่าประเภทยืนยัน - golang.org/ref/spec#Type_assertions ครั้งหนึ่งฉันมีปัญหาในการหาคำศัพท์เฉพาะนี้
Sreejith Ramakrishnan

มันจะทำให้เสียขวัญถ้าอาร์กิวเมนต์ ["<host>"] เป็นศูนย์
Eric2201

89

คุณไม่จำเป็นต้องใช้การยืนยันประเภท แต่เพียงแค่ใช้ตัว%vระบุรูปแบบกับSprintf:

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

นี่เป็นเพียงสิ่งเดียวที่ฉันสามารถใช้งานได้เมื่อพยายามพิมพ์ส่วนต่อประสานของ cast {} เป็นสตริง
FilBot3

1
สำหรับฉันมันไม่ได้ผล สิ่งนี้จบลงด้วยการพิมพ์แผนภูมิไบต์ ASCII แทนสตริงเช่น 201 กลายเป็น "[50,48,49]" ดังนั้นฉันจึงลงเอยด้วยการใช้ fmt.Sprintf ("% s", theThing) แทน ...
Felipe Valdes

18

หากต้องการขยายความเกี่ยวกับสิ่งที่ Peter พูด: เนื่องจากคุณต้องการเปลี่ยนจากอินเทอร์เฟซ {} เป็นสตริงการยืนยันประเภทจะทำให้ปวดหัวเนื่องจากคุณต้องคำนึงถึงประเภทขาเข้าหลายประเภท คุณจะต้องยืนยันแต่ละประเภทที่เป็นไปได้และตรวจสอบว่าเป็นประเภทนั้นก่อนใช้งาน

การใช้ fmt.Sprintf ( https://golang.org/pkg/fmt/#Sprintf ) จะจัดการการแปลงอินเทอร์เฟซโดยอัตโนมัติ เนื่องจากคุณรู้ว่าประเภทเอาต์พุตที่คุณต้องการมักเป็นสตริง Sprintf จะจัดการทุกประเภทที่อยู่หลังอินเทอร์เฟซโดยไม่ต้องใช้รหัสพิเศษมากมายในนามของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.