【问题标题】:Golang interface benefitsGolang 接口的好处
【发布时间】:2017-03-07 10:39:51
【问题描述】:

我阅读了很多关于接口的信息,我想我理解它是如何工作的。我读到了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)
}

【问题讨论】:

标签: go types interface


【解决方案1】:

如果你总是想打印 string 值,那么第一次使用 []interface{} 一点也不好,更糟糕的是你失去了一些编译时检查:如果你通过了包含strings 以​​外的值的切片。

如果您想打印除strings 以外的值,那么带有[]string 的第二个值甚至都无法编译。

例如第一个也处理这个:

PrintAll([]interface{}{"one", 2, 3.3})

虽然第二个会给你一个编译时错误:

不能在 PrintAll 的参数中使用 []interface {} 字面量(类型 []interface {})作为类型 []string

第二个为您提供编译时保证,只传递[]string 类型的切片;如果您尝试传递任何其他内容将导致编译时错误。

另见相关问题:Why are interfaces needed in Golang?

【讨论】:

  • 谢谢。你能说一个简短的现实世界的例子吗?没关系,只是我无法想象如何在现实世界的问题中使用接口的好处。
  • 您在示例中调用的 @PumpkinSeed fmt.Println() 也采用 interface{} 类型的值,这意味着您可以将任何值传递给它。
猜你喜欢
  • 2014-06-20
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2019-07-20
  • 2020-05-15
  • 2017-05-17
相关资源
最近更新 更多