Ir notas de estudio de desarrollo básico (XIV) - función init, funciones anónimas, cierres, Defer

función init

  1. Cada fuente puede contener una función init, que será ejecutado antes de que la función principal, se llama cuadro de ejecución Go.

  2. Generalmente se usa para hacer el trabajo inicial antes de que se ejecute la función principal.

  3. Archivo contiene una definición de las variables globales, init (), y luego la orden principal () de ejecución: una definición variable global -> init () -> main ().

  4. versión del artículo 3 mejorada, en la carpeta principal de la no-src, una función de escritura, la introducción de dos variables, y el inicio de escritura () la función, por lo que en este momento se convierte en el orden de:
    no principal importar el init paquete () - > variable global definida en la principal -> init () -> principal ().

  5. El artículo 4 de la versión mejorada, si src no principal se llama existe una definición de variable y función init () global, archivo principal src contiene variables globales definidas, init (), main (), que es lo que los cinco debería ser el orden de ejecución:
    no la principal importación del paquete global de definición de variables -> del paquete no principal importar el init () -> principal variable global definida en -> init () -> principal ().

    Haciendo referencia al esquema de la figura.

    package main 
    import "<被调用函数>"    //①全局变量定义 ②init()                      
    ③ <全局变量定义>
    ④ func init {
          \<函数体>
    }
    ⑤func main {
    		 \<函数体>
    }
    

función anónima:

  1. escenarios de uso: Generalmente se usa sólo una vez en Aceptar, para llamar una sola vez
  2. Llamar directamente a la hora de definir una función anónima de esta manera sólo puede ser llamado una vez, la presentación de casos:
    package main
    
    import "fmt"
    
    func main() {
    	//直接在创建匿名函数时直接调用,注意下匿名函数格式,传参在函数定义后直接传
    	res := func (n1,n2 int) int {
    		return n1+n2
    	} (10,20)
    	fmt.Println(res)
    }
    
  3. Las funciones anónimas se pueden asignar a una variable, se define por el uso del modo <variable> (para1, PARA2) después de un parámetro bien.
  4. Variable se define en la cantidad completa en una variable, el tipo de datos es una función anónima, puede estar por encima, main () en cualquier lugar se puede utilizar la función anónima.
  5. Ventajas función anónima es la función main () si hay no se permite otro nombre de la función definida, por lo que una función anónima alta flexibilidad.

cierres

  1. El cierre es una función entera asociada con una referencia a la composición del medio ambiente.
  2. valor de retorno de cierre es una función que va a utilizar algunas variables fuera de funciones, que en conjunto forman un todo todo este paquete, llamado el cierre.
  3. Se puede entender, el cierre es una clase, una función de variables externas definir propiedades visto, la función devuelve el valor como método definido, constituyen atributos de clase y métodos, es decir, de cierre.
  4. Figura clave a cabo el cierre es analizar el retorno de la función y la variable que se refiere, constituir cierres, cada llamada a la variable de entorno fuera de función no se reinicializa, pero se acumulan.
    caso:
    package main
    
    import "fmt"
    
    func Addpp() func(int) int {       //定义一个函数 传入的参数是一个func, 返回值为int
    	var n int = 20
    	var str string = "shit!"
    	return func (x int) int {      //Addpp返回值是一个匿名函数,相当于一个累加器了
    		n = n + x
    		str += " damn!"
    		fmt.Println("str= ",str)
    		return n
    	}
    }
    func main() {
    	/*
    		理解闭包的概念,闭包本身是一个函数,闭包的返回值也是一个函数,return func;
    		return 的是一个匿名函数,匿名函数中会调用闭包函数中的变量,从而做一些事情,产生返回值;
    		被匿名函数返回的返回值是匿名函数外的变量,则变量会改变初始化的值
    	*/
    	f := Addpp()
    	fmt.Println(f(1))
    	fmt.Println(f(2))
    	fmt.Println(f(3))
    }
    
  5. Caso: el uso de cierres de pasar un nombre de archivo completo, nombre de archivo .jpg sufijo si no modificar, la salida directa, y si no hay extensión será el nombre del archivo más la salida .jpg:
    determina si el nombre de archivo sufijo, strings.HasSuffix uso ()
    de código es como sigue:
    package main
    import (
    	"fmt"
    	"strings"           //使用strings包的HasSuffix方法判断文件是否有后缀
    )
    
    func makeSuffix (suffix string) func (string) string {            //makeSuffix()实现功能是添加后缀名,返回值为一个函数
    	return func (fileName string) string {                        //
    		if !strings.HasSuffix(fileName,suffix) {
    			fileName += suffix
    			return fileName
    		}
    		return fileName
    	}
    }
    
    func main() {
    	/*
    	案例:使用闭包完成传入一个文件名,如果文件名有后缀.jpg就不用修改,直接输出;如果没有后缀就将文件名加上.jpg输出:
    	         判断文件名是否有后缀,使用strings.HasSuffix()
    	 */
    	var fileName string
    	fmt.Println("请输入传入值的文件名称: ")
    	fmt.Scanf("%s",&fileName)
    	f := makeSuffix(".avi")
    	fmt.Println(f(fileName))
    }
    

Defer
en la función, los programadores a menudo necesitan para crear recursos (conexiones de bases de datos, cerraduras, manijas, etc.), a fin de funcionar después de la ejecución se ha completado, la liberación oportuna de los recursos, abierto, establecer la conexión inmediatamente Defer xxclose

  1. Al realizar la Defer, no se lleva a cabo, esta última se presiona en la declaración Defer pila independiente (Pila de aplazamiento).
  2. Cuando se complete la función, a continuación, difieren de la pila, el último en salir de la pila, lleva a cabo.
  3. Cuando la instrucción de empuje, el valor de correlación se copiará en la pila, por ejemplo, la declaración después del valor de cambio N1 + Defer similares, de acuerdo con el tiempo de empuje, no siga + N1, como el valor de la función de transferencia.
    Ejemplo:
    package main
    import "fmt"
    func sum (n1,n2 int) int {                
    	defer fmt.Println("n2 is OK",n2)         //压栈,辅函数中输入defer,函数结束后本条第二个执行
    	defer fmt.Println("n1 is OK",n1)         //压栈,根据压栈方式可以判定,函数结束后本条第一个执行
    
    	res := n1 + n2
    	fmt.Println("sum is finished")        //终端最先输出的是这句话
    	return res
    }
    func main() {
    	f := sum(10,20)
    	fmt.Println("res的值为",f)             //最后输出的是这句话
    }
    
  4. Como puede verse en el ejemplo anterior, si la vaina puede comprender K8S estudió allí antes de iniciar una pre-salida, hay una subsiguiente después de la parada, a las vainas antes de que algo comienza a configurarse, el otro se termina después de las vainas, lo que hay que hacer.
  5. El valor principal es diferir después de que se terminó la función, la liberación oportuna de recursos para crear una función, tales como la conexión a la base de datos, o abrir el archivo, introduzca el recurso de inmediato Defer cerrado, por lo que la paz de la mente para hacer frente a las cosas, los recursos más naturales tratamiento de funciones cerradas, el buen diseño .
    Análogo:
    FUNC {Test
    File = OpenFile (<nombre de archivo>)
    al aplazar file.close () // escritura inmediata, sin afectar la función se ejecuta o cuando una conexión persistente y Close
    }

Consejos:

  1. suma func (N1, N2 float32) {...} // Tenga en cuenta que de esta manera sin problemas, n1 es el formato float32, no se produce error de compilación.

  2. La función de llamada es posible valores de parámetros pasa por referencia o se pasa dependiendo de si las necesidades de cambiar de forma, si el valor se hace pasar a los tipos de variables directamente básicos, si un puntero se pasa por referencia se utiliza.

    Caso: Escribir una función que compara el número tres tamaños, de pequeño a grande de la salida

    La función de llamada:

    package compare
    func Compare(a *int,b *int,c *int)  {
        var temp int
    	if *a > *b {
    		temp = *a
    		*a = *b
    		*b = temp
    	}
    	if *a > *c {
    		temp = *a
    		*a = *c
    		*c = temp
    	}
    	if *b > *c {
    		temp = *b
    		*b = *c
    		*c = temp
    	}
    }
    

    Llame a la función:

    package main
    
    import (
    	"compare"
    	"fmt"
    )
    
    func main() {
    	var (
    		a int
    		b int
    		c int
    	)
    	fmt.Println("请输入三个数,用空格间隔开:\n")
    	fmt.Scanf("%d %d %d",&a,&b,&c)
    	compare.Compare(&a,&b,&c)
    	fmt.Printf("三个数从小到大排列为:%v %v %v",a,b,c)
    }
    
Publicado 50 artículos originales · alabanza ganado 18 · vistas 4015

Supongo que te gusta

Origin blog.csdn.net/weixin_41047549/article/details/89714567
Recomendado
Clasificación