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的值,这意味着您可以将任何值传递给它。