使用函数从切片中调用函数并获取返回值



我正在将一些Python/Javascript传输到Go,最后一件事出现了问题。

在py/js中,我从数组中调用一个函数,同时循环索引。

Python:

n = [compareUserAgent, hashUserAgent, hashLanguage]
o = seed
u = 0
while u < t:
o ^= (n[getNext() % len(n)](u,seed))
u += 1

Javascript:

for (var n = [compareUserAgent, hashUserAgent, hashLanguage], a, o = a.seed, u = 0; u < t; u++) {
o ^= (0, n[a.getNext() % n.length])(u, a.seed)
}

正如您所看到的,它创建了一个函数数组并调用它们。我试图通过做一些类似的事情来复制这一点:

n := make([]interface{}, 3)
n[0] = CompareUserAgent
n[1] = HashUserAgent
n[2] = HashLanguage

o := seed
for u := 0; u < t; u++ {
o ^= (n[GetNext() & len(n)](u, seed))
}

但我得到了这个错误:cannot call non-function n[GetNext() & len(n)] (type interface {})

有什么帮助吗?

n的元素类型为interface{},而不是函数类型。请记住,与JavaScript和Python不同,Go是一种静态类型的语言;您只能将值视为它定义的类型。由于这些函数似乎都共享相同的签名,所以这应该不是问题;只要做一些类似以下的事情,用论点&return type adapted(由于它们没有显示在您的问题中,我在本例中只使用int(:

type myFn func(int,int) int
n := []myFn{CompareUserAgent,HashUserAgent,HashLanguage}

o := seed
for u := 0; u < t; u++ {
o ^= (n[GetNext() & len(n)](u, seed))
}

问题在于如何定义函数数组。您将它们声明为不可调用的interface{}

相反,您需要将它们定义如下:

type hasher func(int, int) int
n := make([]hasher, 3)

相关内容

  • 没有找到相关文章

最新更新