Go1.23 ha incorporado la función de rango sobre función que fue un experimento en go1.22 para usarse de verdad. Si alguien ha leído el código de muestra, es posible que tenga que hacerlo. meditar durante mucho tiempo. No hagas eso. P'Yod te lo explicará de una forma muy sencilla para que lo leas
A partir de la especificación de Para declaraciones con cláusula de rango, se han agregado 3 tipos de Expresiones:
func(func() bool) func(func(V) bool) func(func(K, V) bool)
Me gustaría agregar una variable para explicar lo siguiente
f func(yield func() bool) f func(yield func(V) bool) f func(yield func(K, V) bool)
La especificación dice que cuando usamos la función f como expresión de rabia, cada vez que llamamos a la función de rendimiento allí antes de finalizar la función f, obtenemos el resultado en cada ciclo. Igual al valor que insertamos en el rendimiento. Todavía estoy confundido cuando lo explico. Mejor escribir código
func main() { for range loop { fmt.Println("-") } } func loop(yield func() bool) { yield() yield() }
producción:
- -
Si escribimos código como este, obtendremos 2 bucles completos porque llamamos a rendimiento 2 veces en f según la especificación, aquí lo llamamos bucle y no nos devolverá nada. Porque elegimos usar un patrón con un rendimiento que no acepta ningún argumento
Otro ejemplo
func main() { for i := range loop { fmt.Println(i) } } func loop(yield func(int) bool) { yield(3) yield(7) }
producción:
3 7
De esta manera obtendremos 2 rondas también porque llamamos rendimiento una vez y ahora el rango devolverá 2 valores que son 3 y 7 que usamos para llamar rendimiento cada vez
Otro ejemplo
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") }
producción:
3 three 5 five 7 seven
Obtendremos 3 bucles y obtendremos 2 valores por bucle según lo que pongamos en el rendimiento cada vez
Y también podemos llamar a rendimiento insertando cualquier tipo de argumentos como
func loop(yield func(string, bool) bool) { yield("three", true) yield("five", false) yield("seven", false) }
Ahora que entendemos su mecanismo. Cuando leamos ejemplos difíciles, entenderemos más, como el ejemplo de Go Wiki: Experimento Rangefunc
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 } } } }
principal
s := []string{"hello", "world"} for i, x := range slices.Backward(s) { fmt.Println(i, x) }
Mucho más fácil de leer, ¿verdad? Al final, cómo aplicarlo depende de ti. Solo miramos cuántas veces se llama al rendimiento. Sólo lo obtendrás cuando lo pongas dentro del alcance
El valor que saldrá es el valor incluido en el rendimiento. Fin
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3