我经常阅读有关接口的内容,我想我明白它是如何工作的。我读到了interface{}
类型并使用它来获取函数的参数。很明显。我的问题(以及我不理解的)是我使用它的好处。我可能没有完全得到它,但是我有这个:
package main
import (
"fmt"
)
func PrintAll(vals []interface{}) {
for _, val := range vals {
fmt.Println(val)
}
}
func main() {
names := []string{"stanley", "david", "oscar"}
vals := make([]interface{}, len(names))
for i, v := range names {
vals[i] = v
}
PrintAll(vals)
}
为什么它比这更好:
package main
import (
"fmt"
)
func PrintAll(vals []string) {
for _, val := range vals {
fmt.Println(val)
}
}
func main() {
names := []string{"stanley", "david", "oscar"}
PrintAll(names)
}
答案 0 :(得分:1)
如果您总是想要打印string
值,那么第一次使用[]interface{}
并不是更好,因为您丢失了一些编译时检查会更糟糕:它不会警告您如果传递的切片包含string
s以外的值。
如果要打印string
以外的值,则[]string
的第二个值甚至不会编译。
例如,第一个也处理这个:
PrintAll([]interface{}{"one", 2, 3.3})
虽然第二个会给你一个编译时错误:
不能使用[] interface {} literal(type [] interface {})作为PrintAll参数中的type []字符串
第二代为您提供编译时保证只传递[]string
类型的片段;如果你试图传递任何其他会导致编译时错误。
另请参阅相关问题:Why are interfaces needed in Golang?