如何将接口传递给具有大量参数的方法

时间:2018-08-27 01:51:34

标签: go go-interface

我写了一个惰性代码来演示我必须实现接口的问题。我有方法M1,M2,它们将struct X作为参数,并且具有类型structY。我希望所有这些方法都可以通过一个接口I实现。问题是实现接口的方法M我需要知道必须传递给子方法(M1,M2)的参数。我在M中传递多个参数时收到错误消息:New-Variable -Name 'ssfBITBUCKET' -Option Constant -Value 0x0A; $application = New-Object -ComObject 'Shell.Application'; $bitBucket = $application.NameSpace($ssfBITBUCKET); for ($column = 0; -not [String]::IsNullOrEmpty(($details = $bitbucket.GetDetailsOf($null, $column))); $column++) { New-Object -TypeName 'PSObject' -Property @{ Column = $column; Name = $details; }; }

Column Name
------ ----
     0 Name
     1 Original Location
     2 Date Deleted
     3 Size
     4 Item type
     5 Date modified
     6 Date created
     7 Date accessed
     8 Attributes
     ...

1 个答案:

答案 0 :(得分:3)

在您的示例中导致<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

*)更改M1M2以返回int而不是struct并修复使用接收方进行函数声明的语法