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