Go1.23 では、go1.22 で実験だった range-over-func 機能が実際に使用できるようになりました。サンプル コードを読んだことがある人は、そうする必要があるかもしれません。少し長い時間瞑想する。そんなことはしないでください。 P'Yod が
を読むために非常に簡単に説明します。範囲句を含む For ステートメントの仕様から、3 種類の式が追加されました:
func(func() bool) func(func(V) bool) func(func(K, V) bool)
次のように説明するために変数を 1 つ追加したいと思います
f func(yield func() bool) f func(yield func(V) bool) f func(yield func(K, V) bool)
仕様によれば、関数 f を rage の式として使用する場合、関数 f を終了する前にそこで yield 関数を呼び出すたびに、各ループで結果が得られます。 yield に挿入した値と同じです。説明するとまだ混乱します。コードを書いた方が良い
func main() { for range loop { fmt.Println("-") } } func loop(yield func() bool) { yield() yield() }
出力:
- -
このようなコードを書くと、仕様に従って f で yield を 2 回呼び出すため、2 つの完全なループが得られます。ここではループという名前を付けますが、何も返しません。引数を受け入れないyieldのパターンを使用することを選択しているため
別の例
func main() { for i := range loop { fmt.Println(i) } } func loop(yield func(int) bool) { yield(3) yield(7) }
出力:
3 7
この方法では、yield を 1 回呼び出すと、range が 2 つの値 (毎回 yield を呼び出すのに使用する 3 と 7) を返すため、同様に 2 ラウンドを取得します
別の例
func main() { for i := range loop { fmt.Println(i) } } func Loop(yield func(int, string) bool) { yield(3, "three") yield(5, "five") yield(7, "seven") }
出力:
3 three 5 five 7 seven
3 つのループを取得し、毎回の yield に入力した値に応じてループごとに 2 つの値を取得します
また、
などの任意のタイプの引数を挿入して yield を呼び出すこともできます。
func loop(yield func(string, bool) bool) { yield("three", true) yield("five", false) yield("seven", false) }
その仕組みが分かりました。 Go Wiki の例: Rangefunc Experiment
など、難しい例を読むとさらに理解が深まります。
package slices func Backward[E any](s []E) func(func(int, E) bool) { return func(yield func(int, E) bool) { for i := len(s)-1; i >= 0; i-- { if !yield(i, s[i]) { return } } } }
主要
s := []string{"hello", "world"} for i, x := range slices.Backward(s) { fmt.Println(i, x) }
かなり読みやすくなりましたね?結局のところ、それをどのように適用するかはあなた次第です。ここでは、yield がコールされた回数のみを確認します。範囲内に置いた場合にのみ取得できます
出力される値は、End
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3