私はGo新人です。タイプはGoでどのように関数になりますか?
私はsome Kubernetes source codeを見ています。
私はこれを参照してください。私はこれを読むためにhazily方法を知っているが、私は、私は私の専門用語が間違って取得するつもりだと確信している
// 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
という名前のこの関数を呼び出すことができます。それは私ので、その型はstring
あり、そしてそれは三つの値を返す、などなど
(私はmy best guess as to where it should live in the language specificationで、この特定の建設のためのBNFが表示されていないが、私はこのような構成を見てきました何回か前にkey
を受け入れます信仰の上にそれを取る)ソースコード内の最大高
が、私はこれに気づく:。
// keyLookupFunc adapts a raw function to be a KeyLookup.
type keyLookupFunc func() []testFifoObject
OK、そう確かにkeyLookupFunc
タイプがあり、そして取る機能があるものを記述するために使用されます0のパラメータを返し、testFifoObject
のスライスを返します。
私はkeyLookupFunc
型の変数を手に持っていれば、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
はどのようにそれはまた、このコードが「上」GetByKey
を呼び出すことができるというkeyLookupFunc
ようにすることができ、DeltaFIFO
へのポインタであることを考えると?これらの点をどのように結びつけるのですか?
注最後f.GetByKey
である:
// GetByKey returns the complete list of deltas for the requested item,
// setting exists=false if that list is empty.
// You should treat the items returned inside the deltas as immutable.
func (f *DeltaFIFO) GetByKey(key string) (item interface{}, exists bool, err error) {
f.lock.RLock()
defer f.lock.RUnlock()
d, exists := f.items[key]
if exists {
// Copy item's slice so operations on this slice (delta
// compression) won't interfere with the object we return.
d = copyDeltas(d)
}
return d, exists, nil
}
及びこの二GetByKey
方法は、2つの異なるタイプの二つの別個の方法、(同じ名前のメソッドを持つ2つの異なるタイプ)である
'DeltaFIFO' **も**' keyLookupFunc'ではありませんが、**、それはまた、メソッドを持っている**と呼ばれる 'GetByKey' https://github.com/kubernetes/kubernetes/blob/マスター/ステージング/ src/k8s.io/client-go/tools/cache/delta_fifo.go#L392-L402 2つの異なる型は同じ名前のメソッドを持つことができますが、問題はありません。 – mkopriva
ありがとうございます。私はそれを見たに違いありません。どのように恥ずかしい。ただし、この 'GetByKey'関数は[この' .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