Golang接口优势

Golang接口优势,go,types,interface,Go,Types,Interface,我读了很多关于接口的书,我想我理解它是如何工作的。我阅读了有关接口{}类型的文章,并使用它获取函数的参数。这是清楚的。我的问题是(我不明白的是),如果我使用它,我的好处是什么。可能我没有完全理解,但例如,我有: package main import ( "fmt" ) func PrintAll(vals []interface{}) { for _, val := range vals { fmt.Println(val) } } func ma

我读了很多关于接口的书,我想我理解它是如何工作的。我阅读了有关
接口{}
类型的文章,并使用它获取函数的参数。这是清楚的。我的问题是(我不明白的是),如果我使用它,我的好处是什么。可能我没有完全理解,但例如,我有:

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)
}

如果您总是想打印
字符串
值,那么第一次使用
[]接口{}
一点也不好,更糟糕的是,您丢失了一些编译时检查:如果您传递了一个包含
字符串
以外的值的切片,它不会警告您

如果要打印除
string
s以外的值,则使用
[]string
的第二个值甚至不会编译

例如,第一种方法也处理此问题:

PrintAll([]interface{}{"one", 2, 3.3})
而第二个会给您一个编译时错误:

无法将[]接口{}文字(类型[]接口{})用作PrintAll的参数中的类型[]字符串

第二种方法在编译时保证只传递类型为
[]string
的片段;如果您试图传递任何其他内容,将导致编译时错误


另请参阅相关问题:

当您可以改变底层实现,但不改变使用它的所有代码时,请使用接口。使用接口的好处是什么?解耦代码。看见“动态”调用一个方法。看见访问围棋包。看见给变量赋值。看,谢谢。你能举一个简单的现实例子吗?没关系,只是我无法想象在现实世界的问题中如何使用接口{}的好处。@Pumpkinsed(您在示例中调用的)也接受
interface{}
type的值,这意味着您可以将任何值传递给它。