【发布时间】: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 不建议切片或接口的任何要求。只需指定具体类型。 -
请注意,如果您需要一个或多个参数,您可以使用可变参数函数,但这与您是否需要接口{}是不同的问题。