自定义函数类型可以可变吗?

时间:2020-07-14 20:57:14

标签: go variadic-functions

我有一个自定义函数类型MyFuncType,它接受一个MyStruct类型的参数:

type MyStruct struct {
  SomeVar string
}

type MyFuncType func(MyStruct)

var fn MyFuncType
fn = func(ms MyStruct) {//...}

然后我想我可以更改MyFuncType的定义以传递其他参数:

type MyFuncType func(MyStruct, ...interface{})

var fn MyFuncType
fn = func(ms MyStruct, suffix string, anythigIWant int) {//...}

现在,编译器抱怨fn的类型不兼容。好的,我想我可以理解可变数量的参数不能定义函数签名... 但即使定义如下:

type MyFuncType func(MyStruct, interface{})

是同一首歌。 最后,无法将interface {}用作自定义函数类型中的参数的[any]类型,还是我在这里遗漏了什么?

我的解决方法是将MyFuncType类型的函数的实现附加到提供其他所需数据的结构上。

1 个答案:

答案 0 :(得分:3)

您的问题是func签名,您需要完全按照type中的定义进行定义,然后可以使用它发送任意内容:

type MyFuncType func(MyStruct, ...interface{})

var fn MyFuncType
fn = func(ms MyStruct, args...interface{}) {
    fmt.Println(ms.SomeVar, args[0], args[1])
}

// Using it as if the signature was:
// func(ms MyStruct, suffix string, anythigIWant int)
fn(MyStruct{SomeVar: "some var"}, "suffix", 123)

签出:https://play.golang.org/p/R_qZoul9AcV