我正在将一些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)