ฉันอยากรู้ว่าทำไมไปโดยปริยายกวนแปลง[]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 หรือสตริง