ฉันอยากรู้ว่าทำไมไปโดยปริยายกวนแปลง[]Tไป[]interface{}เมื่อมันโดยปริยายจะแปลงไปT interface{}มีบางอย่างที่ไม่สำคัญกับการแปลงนี้ที่ฉันขาดไปหรือไม่?
ตัวอย่าง:
func foo([]interface{}) { /* do something */ }
func main() {
var a []string = []string{"hello", "world"}
foo(a)
}
go build บ่น
ไม่สามารถใช้สตริง (ประเภท []) เป็นประเภท [] อินเตอร์เฟส {} ในอาร์กิวเมนต์ของฟังก์ชัน
และถ้าฉันพยายามทำมันอย่างชัดเจนสิ่งเดียวกัน: b := []interface{}(a)บ่น
ไม่สามารถแปลงสตริง (พิมพ์ []) เป็นพิมพ์ [] อินเตอร์เฟส {}
ดังนั้นทุกครั้งที่ฉันจำเป็นต้องทำการแปลงนี้ (ซึ่งดูเหมือนจะเกิดขึ้นมาก) ฉันได้ทำสิ่งนี้:
b = make([]interface{}, len(a), len(a))
for i := range a {
b[i] = a[i]
}
มีวิธีที่ดีกว่าในการทำเช่นนี้หรือฟังก์ชันไลบรารีมาตรฐานเพื่อช่วยในการแปลงเหล่านี้หรือไม่ ดูเหมือนโง่ที่จะเขียนโค้ดพิเศษ 4 บรรทัดทุกครั้งที่ฉันต้องการเรียกใช้ฟังก์ชันที่สามารถรับรายการเช่น int หรือสตริง