Golang界面的好处

时间:2016-10-25 11:38:47

标签: go types interface

我经常阅读有关接口的内容,我想我明白它是如何工作的。我读到了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)
}

1 个答案:

答案 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?