首页 > 解决方案 > 如何将接口传递给有很多参数的方法

问题描述

我编写了一个惰性代码来演示我必须实现接口的问题。我有方法 M1、M2 以结构 X 作为参数并具有结构 Y 类型。我希望所有这些方法都由单个接口 I 实现。问题是实现接口的方法 M 我需要注意需要传递给子方法(M1,M2)的参数。我收到一个错误:<argument name> used as a value当我在 M 中传递多个参数时

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
}

标签: gogo-interface

解决方案


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

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

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

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为 returnint而不是struct并修复带有接收器的函数声明的语法


推荐阅读