我是個新手。我正在尋找some Kubernetes source code。一個類型在Go中如何成爲函數?
我看到這一點:
// GetByKey returns the key if it exists in the list returned by kl.
func (kl keyLookupFunc) GetByKey(key string) (interface{}, bool, error) {
for _, v := range kl() {
if v.name == key {
return v, true, nil
}
}
return nil, false, nil
}
我朦朧地知道如何閱讀,但我敢肯定,我會得到我的術語錯誤:有一個地方叫keyLookupFunc
類型,kl
是有效的它的實例,並且可以調用名爲GetByKey
的此函數。它接受一個key
類型爲string
,並返回三個值,等等,等等
(我沒有看到BNF在my best guess as to where it should live in the language specification這個特殊的建築,但我之前,所以見過這種結構好幾次我只要相信)
越往上源代碼,我注意到這一點:
// keyLookupFunc adapts a raw function to be a KeyLookup.
type keyLookupFunc func() []testFifoObject
OK,所以確實keyLookupFunc
是一種類型,它是用來描述的東西,是需要一個功能零參數並返回一片testFifoObject
s。如此天真,如果我手上有一個keyLookupFunc
-type變量,我應該可以調用GetByKey
「on」。我不完全確定一個函數在這種情況下的行爲如何,但我會信賴它。
現在,當我看看,看看這是怎麼用的,我see this partial stuff:
func TestDeltaFIFO_requeueOnPop(t *testing.T) {
f := NewDeltaFIFO(testFifoObjectKeyFunc, nil, nil)
f.Add(mkFifoObj("foo", 10))
_, err := f.Pop(func(obj interface{}) error {
if obj.(Deltas)[0].Object.(testFifoObject).name != "foo" {
t.Fatalf("unexpected object: %#v", obj)
}
return ErrRequeue{Err: nil}
})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if _, ok, err := f.GetByKey("foo"); !ok || err != nil {
t.Fatalf("object should have been requeued: %t %v", ok, err)
}
注意f.GetByKey("foo")
調用。 f
是指向DeltaFIFO
,其中I just happen to know is returned by NewDeltaFIFO
。
鑑於f
是一個指向DeltaFIFO
,怎麼還可以是這樣keyLookupFunc
,這個代碼可以「」它叫GetByKey
?我如何連接這些點?
'DeltaFIFO' **是不是也**'keyLookupFunc',但**它也有一個方法叫**'GetByKey' https://github.com/kubernetes/kubernetes/blob/主/分期/ src目錄/ k8s.io /客戶去/工具/緩存/ delta_fifo.go#L392-L402。兩種不同的類型可以有一個名稱相同的方法,在那裏沒有問題。 – mkopriva
謝謝;我應該看到的;多麼尷尬。然而,這意味着這個'GetByKey'函數不會在[this'.go'文件]的其餘部分使用(https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io /client-go/tools/cache/delta_fifo.go),對不對? –
看起來好像不是,也許它是遺留的,也許它是爲了以後使用的東西,我不知道。如果你[搜索](https://github.com/kubernetes/kubernetes/search?utf8=%E2%9C%93&q=keyLookupFunc&type=),你可以看到該標識符僅用於大約1年的文檔。 ..如果你[搜索](https://github.com/kubernetes/kubernetes/search?utf8=%E2%9C%93&q=testFifoObject&type=),你會看到沒有實際的功能匹配'keyLookupFunc'類型...順便說一下,如果你對函數類型感興趣,可以看看'net/http.HandlerFunc',它很有名。 – mkopriva