如何将接口传递给有很多参数的方法

How to pass interface to method that have lot of arguments

我写了一个惰性代码来演示我必须实现接口的问题。我有方法 M1、M2,它们将结构 X 作为参数并具有结构 Y 的类型。我希望所有这些方法都由单个接口 I 实现。问题是实现接口的方法 M 我需要注意需要传递给子方法 (M1,M2) 的参数。当我在 M

中传递多个参数时,出现错误:<argument name> used as a value
type Y struct {
 a int
}

type X struct {
 a int
}

(y *Y) func M1(x X) struct {
 return y.a+x.a
}

(y *Y) func M2(x X) struct {
 return y.a*x.a
}

type I interface {
 M1(x X)
 M2(x X)
}

func M(i I, x X) {
 fmt.println(i.M1(x)) //returns an error i.M1(x) used as a value
 fmt.println(i.M2(x)) //returns an error i.M2(x) used as a value
}

在您的示例中导致 <argument name> used as a value 错误的问题是,形成接口 I 的函数被声明为没有 return 值:

type I interface {
 M1(x X)
 M2(x X)
}

如果函数 return 什么都没有:fmt.println(i.M1(x)),您当然不能将函数调用作为 Println 的参数传递。将示例中的接口声明更改为 return 某些内容(以及更多修复*):

type Y struct {
 a int
}

type X struct {
 a int
}

func(y *Y) M1(x X) int {
 return y.a+x.a
}

func(y *Y) M2(x X) int {
 return y.a*x.a
}

type I interface {
 M1(x X) int
 M2(x X) int
}

func M(i I, x X) {
 fmt.Println(i.M1(x))
 fmt.Println(i.M2(x))
}

playground

*) 将 M1 & M2 更改为 return int 而不是 struct 并修复带有 receiver

的函数声明语法