在Golang中传递接口{}或[]接口{}
对于这个代码段,为什么它允许接口{}传递到函数中,而不允许[]接口。有什么区别?我知道错误是怎么说的(我已经在函数中注释了它),但我不确定错误是什么意思在Golang中传递接口{}或[]接口{},go,interface,Go,Interface,对于这个代码段,为什么它允许接口{}传递到函数中,而不允许[]接口。有什么区别?我知道错误是怎么说的(我已经在函数中注释了它),但我不确定错误是什么意思 类型接口{}可以用作非常通用的类型,允许为其分配任何其他类型 因此,如果函数接收到接口{},则可以向其传递任何值 这是因为在Go中,要使类型满足接口,它必须只实现接口声明的所有方法 因为接口{}是一个空接口,任何类型都可以满足它 另一方面,要使类型满足[]接口{}的要求,它必须是空接口的实际片段 因此,如果您需要一个可以接收任何值的通用函数,
类型
接口{}
可以用作非常通用的类型,允许为其分配任何其他类型
因此,如果函数接收到接口{}
,则可以向其传递任何值
这是因为在Go中,要使类型满足接口,它必须只实现接口声明的所有方法
因为接口{}
是一个空接口,任何类型都可以满足它
另一方面,要使类型满足[]接口{}
的要求,它必须是空接口的实际片段
因此,如果您需要一个可以接收任何值的通用函数,只需使用示例中所示的interface{}
请注意,
interface{}
将允许您传入值或指针引用,因此您可以将指针或值模糊地传入该函数。[]interface{}
本身不是接口,而是一个切片*smsSendRequest
不是空接口的一部分,因此不能将其作为参数传递。谢谢Jim,有没有办法重写它,以便我可以将其作为参数传递?或者我应该把指针放在函数中吗?我试图避免这种情况,这样我就可以轻松地将该函数用于其他参数。接口{}
类型有什么问题?如果您想要接受任何类型,这就是您所使用的。interface{}
(空接口)由Go中的每个类型(包括smsSendRequest
)满足/实现<代码>[]接口{}是一片空接口,它只“满足”自身,而不满足其他任何要求。您的代码片段不建议对切片或接口有任何要求。只需指定具体类型。注意,如果需要一个或多个参数,可以使用变量函数,但这与是否需要接口{}是不同的问题。
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)
}