在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)
}