Tôi tò mò tại sao Go không hoàn toàn chuyển đổi []T
thành []interface{}
khi nào nó sẽ hoàn toàn chuyển đổi T
thành interface{}
. Có điều gì không tầm thường về chuyển đổi này mà tôi đang thiếu?
Thí dụ:
func foo([]interface{}) { /* do something */ }
func main() {
var a []string = []string{"hello", "world"}
foo(a)
}
go build
phàn nàn
không thể sử dụng một (kiểu [] chuỗi) làm kiểu [] giao diện {} trong đối số hàm
Và nếu tôi cố gắng làm điều đó một cách rõ ràng, điều tương tự: b := []interface{}(a)
phàn nàn
không thể chuyển đổi một (loại [] chuỗi) sang loại [] giao diện {}
Vì vậy, mỗi khi tôi cần thực hiện chuyển đổi này (dường như xuất hiện rất nhiều), tôi đã làm một việc như thế này:
b = make([]interface{}, len(a), len(a))
for i := range a {
b[i] = a[i]
}
Có cách nào tốt hơn để làm điều này hoặc các chức năng thư viện tiêu chuẩn để trợ giúp với các chuyển đổi này không? Có vẻ hơi ngớ ngẩn khi viết thêm 4 dòng mã mỗi khi tôi muốn gọi một hàm có thể lấy danh sách ví dụ ints hoặc chuỗi.