Как передать интерфейс методу, у которого много аргументов - PullRequest
0 голосов
/ 27 августа 2018

Я написал ленивый код, чтобы продемонстрировать проблему, связанную с реализацией интерфейсов.У меня есть методы M1, M2, которые принимают struct X в качестве аргумента и имеют тип struct 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
}

1 Ответ

0 голосов
/ 27 августа 2018

Проблема, которая вызывает ошибку <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, чтобы вернуть int вместо struct и исправьте синтаксис для объявления функции с получателем

...