【问题标题】:Passing interface{} or []interface{} in Golang在 Golang 中传递 interface{} 或 []interface{}
【发布时间】:2018-05-10 15:00:25
【问题描述】:

有了这个sn-p,为什么它允许interface{}传入函数而不是[]interface。有什么区别?我知道错误的含义(已将其注释到函数中),但我不确定错误的含义。

https://play.golang.org/p/689R_5dswFX

package main

type smsSendRequest struct {
    Recipients     string `json:"recipients"`
}

// func action(pass interface{}) {
//     //works
// }

func action(pass []interface{}) {
    //cannot use data (type *smsSendRequest) as type []interface {} in argument to action
}

func main() {
    to := "15551234567"
    var data = &smsSendRequest{
        Recipients:     to,
    }
    action(data)
}

【问题讨论】:

  • []interface{} 本身不是一个接口,它是一个切片。 *smsSendRequest 不是一片空接口,所以不能作为参数传递。
  • 谢谢吉姆,有没有办法重写它,以便我可以将它作为参数传递?还是我应该只在函数中使用指针?我试图避免这种情况,这样我就可以轻松地将该函数重用于其他参数。
  • interface{} 类型有什么问题?如果你想接受 any 类型,那就是你使用的。
  • interface{}(空接口)由 Go 中的每种类型(包括smsSendRequest)满足/实现。 []interface{} 是一个 slice 空接口,只有它自己“满足”,没有别的。您的代码 sn-p 不建议切片或接口的任何要求。只需指定具体类型。
  • 请注意,如果您需要一个或多个参数,您可以使用可变参数函数,但这与您是否需要接口{}是不同的问题。

标签: go interface


【解决方案1】:

interface{} 类型可以用作一个非常通用的类型,允许将任何其他类型分配给它。

所以如果一个函数接收到interface{},你可以向它传递任何值。

这是因为在 Go 中,要满足接口的类型,它必须只实现接口声明的所有方法。

由于interface{}是一个空接口,任何类型都可以满足。

另一方面,要满足[]interface{} 的类型,它必须是空接口的实际切片。

因此,如果您需要一个可以接收任何值的通用函数,只需使用您在示例中显示的 interface{}

请注意,interface{} 将允许您传递值或指针引用,因此您可以将指针或值模糊地传递给该函数。

【讨论】:

    猜你喜欢
    • 2018-08-22
    • 2017-10-17
    • 2014-12-30
    • 2015-03-19
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2017-07-31
    • 2018-08-06
    相关资源
    最近更新 更多