Lenguaje De Programación: Go

   EMBED

Share

Preview only show first 6 pages with water mark for full document please download

Transcript

Lenguaje de Programación: Go Jorge Sebastian Hernández Domínguez Centro de Investigación y de Estudios Avanzados del I.P.N 9 de Noviembre de 2011 Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Go I I Es un lenguaje de programación de propósito general que es promovido por: Rob Pike, Robert Griesemer, Ken Thompson, Russ Cox, Ian Lance Taylor. Todos ellos de Google Go tiene las siguientes características: I I I I I I Lenguaje compilado Tipado estático Rápido Soporte de concurrencia Open Source Página web: http://golang.org Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Go I Existen dos compiladores para Go: I I Gccgo - Basado en GCC Suite 6g, 8g, etc. (Dependiendo de la arquitectura) Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Hello world! I Cada código fuente declara el paquete al que pertenece (main), además de los paquetes a usar (fmt) I Funciones se declaran con func Comentarios: I I I I /* comentario multilínea */ // comentario una línea El punto y coma (;) es opcional p a c k a g e main i m p o r t " fmt " f u n c main ( ) { fmt . P r i n t f ( " H e l l o w o r l d " ) } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Declaraciones I Se utiliza la palabra reservada var I El tipo de dato se pone al final var x , y , z i n t Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Asignación múltiple I Go permite hacer asignación múltiple I Dichas asignaciones se realizan en paralelo i , j = j , i // i n t e r c a m b i a i con j Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Funciones I El tipo se pone después del nombre de la variable I Cuando dos o más parámetros son del mismo tipo solo es necesario el tipo en el último parámetro f u n c add ( x i n t , y i n t ) i n t { return x + y } f u n c add ( x , y i n t ) i n t { return x + y } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Funciones I Una función puede regresar cualquier número de resultados f u n c swap ( x , y s t r i n g ) ( s t r i n g , s t r i n g ) { return y , x } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Asignación corta I Dentro de una función, se puede usar := en lugar de var x := 1 y , z := 2 , 3 Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Constantes I Se utiliza la palabra reservada const. I Pueden ser string, booleanos o numéricos. I El tipo de la constante puede obtenerse del contexto const Pi f l o a t 6 4 = 3.14 c o n s t c a d e n a = " Hola mundo" Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go For I Solo existe una estructura para los ciclos en Go (for). I No se usan paréntesis y las llaves son obligatorias. f o r i := 0 ; i < 1 0 ; i++ { sum += i } f o r sum < 1000 { // w h i l e sum += sum } f o r { // i n f i n i t o } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go If I No se usan paréntesis y las llaves son obligatorias. I También puede agregarse una sentencia antes de la condición x = −10 if x < 0 { fmt . P r i n t l n ( " x e s menor que 0 " ) } i f v := 5 ; x < v { fmt . P r i n t l n ( " x e s menor que v " ) } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Defer I Defer ejecuta una función cuando la función que la encierra regresa I Se utiliza una pila para para resolver el orden de varios defer I Útil para cerrar archivos func f () { f o r i := 0 ; i < 5 ; i++ { d e f e r fmt . P r i n t f (" %d " , i ) } } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Ejercicio: Defer I ¿Cuál es la salida? f u n c t r a c e ( s s t r i n g ) { fmt . P r i n t l n ( " e n t e r i n g : " , s ) } f u n c u n t r a c e ( s s t r i n g ) { fmt . P r i n t l n ( " l e a v i n g : " , s ) } func a () { t r a c e (" a ") d e f e r u n t r a c e (" a ") fmt . P r i n t l n ( " i n a " ) } func b () { t r a c e (" b ") d e f e r u n t r a c e (" b ") fmt . P r i n t l n ( " i n b " ) a () } f u n c main ( ) { b ( ) } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Structs I Es una colección de datos I Cada dato se puede acceder con un punto type Vertex s t r u c t { X int Y int } v := V e r t e x { 1 , 2} v .X = 4 Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Structs I Se puede asignar un subconjunto de campos usando la notación campo:valor I El prefijo & construye un puntero a la estructura var ( p = V e r t e x { 1 , 2} q = &V e r t e x { 1 , 2} r = V e r t e x {X : 1} s = V e r t e x {} ) // // // // Jorge Sebastian Hernández Domínguez tipo Vertex tipo ∗ Vertex Y:0 es i m p l i c i t o X : 0 and Y : 0 Lenguaje de Programación: Go New I La expresión new(Vertex) asigna memoria para Vertex y regresa un puntero a esta I No existe un delete o free. Go tiene un garbage collector type Vertex s t r u c t { X, Y i n t } f u n c main ( ) { v a r v ∗ V e r t e x = new ( V e r t e x ) v := new ( V e r t e x ) } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Arreglos I Los arreglos son valores y no punteros como en C. I Entonces, el asignar un arreglo a otro copia todos sus elementos var intArray [ 3 ] i n t i n t A r r a y 2 := [ 3 ] i n t { 1 , 2 , 3} i n t A r r a y 3 := [ . . . ] i n t { 4 , 5 , 6} Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Arreglos I Si pasamos un arreglo a una función, este recibe una copia del arreglo y no un puntero a este. I Sin embargo, también podemos usar la dirección de memoria del arreglo. func f ( a [ 3 ] i n t ) { a [0]=10 } func fp ( a ∗ [ 3 ] i n t ) { a [0]=10 } f u n c main ( ) { var ar [ 3 ] i n t f ( ar ) fmt . P r i n t l n ( a r ) f p (& a r ) fmt . P r i n t l n ( a r ) } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Ejercicio: Invertir un arreglo I Implemente una función que invierta un arreglo I Utilice la asignación múltiple Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Ejercicio: Invertir un arreglo I Implemente una función que invierta un arreglo I Utilice la asignación múltiple func reverseArray ( a [ 1 0 ] i n t ) [ 1 0 ] i n t { f o r i , j := 0 , l e n ( a ) −1; i < j ; i , j = i +1, j −1 { a[ i ] , a[ j ] = a[ j ] , a[ i ] } return a } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Slices I Los slices son una rebanada de un arreglo (una referencia a estos). I Los slices son referencias. Por lo tanto, si asignamos un slice a otro, ambos se refieren al mismo arreglo. var arr [ 3 ] i n t a r r = [ 3 ] i n t {1 ,2 ,3} var s l i c e [ ] i n t s l i c e = arr [0:2] Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Make I Make sirve para crear slices, maps, y channels. I Estos tres tipos en realidad refieren a una estructura interna I Make inicializa dicha estructura interna y crea la nueva estructura (slice, map, o channel) v a r v [ ] i n t = make ( [ ] i n t , 1 0 0 ) p := make ( [ ] i n t , 1 0 0 ) Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Volviendo a Slices I Un slice tiene largo y capacidad I La capacidad de un slice es el máximo tamaño que esta puede crecer I La capacidad se puede indicar con un tercer parámetro en make b := make ( [ ] i n t , 0 , 5 ) // l e n ( b )=0 , cap ( b)=5 fmt . P r i n t l n ( l e n ( b ) , cap ( b ) ) Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Maps I Mapean una llave a un valor I Deben ser creados con make m = make ( map [ s t r i n g ] V e r t e x ) m[ " B e l l Labs " ] = V e r t e x { 40.68433 , 74.39967 , } fmt . P r i n t l n (m[ " B e l l Labs " ] ) Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Maps I Para probar si una llave esta presente en un mapa se usa una asignación múltiple m = map [ s t r i n g ] f l o a t 6 4 { " 1 " : 1 , " p i " : 3 . 1 4 1 5 } var value float64 var present bool v a l u e , ok := m[ " 2 " ] Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Function full closures I Un closure es una función que incluye el contexto en el que fue definida. I Por ende, puede referenciar variables de dicho contexto Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Function full closures func adder () func ( i n t ) i n t { sum := 0 return func ( x i n t ) i n t { sum += x r e t u r n sum } } f u n c main ( ) { pos , neg := a d d e r ( ) , a d d e r ( ) f o r i := 0 ; i < 1 0 ; i++ { fmt . P r i n t l n ( p o s ( i ) , neg (−2∗ i ) ) } } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Ejercicio: Fibonacci closure I Utilizando closures implemente una función que obtenga una serie de números Fibonacci Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Ejercicio: Fibonacci closure I Utilizando closures implemente una función que obtenga una serie de números Fibonacci func f i b () func () i n t { a , b := 0 , 1 return func () i n t { a , b = b , a + b return a } } f := f i b ( ) f o r i := 0 ; i < 10 ; i ++ { fmt . P r i n t l n ( f ( ) ) } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Range I Un ciclo for (de tipo range) puede usarse para iterar sobre un slice o un map I Se puede ignorar la llave o el valor usando “_” v a r pow = [ ] i n t { 1 , 2 , 4 , 8 , 1 6 , 3 2 , 6 4 , 128} f o r i , v := r a n g e pow { fmt . P r i n t f ("2∗∗ %d = % d\n " , i , v ) } f o r _, v := r a n g e pow { fmt . P r i n t f (" %d\n " , v a l u e ) } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Switch I Cada caso se interrumpe (“breaks”) automáticamente a menos que termine con la palabra clave fallthrough s w i t c h o s := r u n t i m e . GOOS ; o s { case " darwin ": fmt . P r i n t l n ( "OS X . " ) case " l i n u x ": fmt . P r i n t l n ( " L i n u x . " ) default : fmt . P r i n t f (" %s . " , o s ) } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Métodos I Go no tienes clases, pero se pueden definir métodos en tipos I A p se le conoce como el receptor type Vertex s t r u c t { X, Y f l o a t 6 4 } f u n c ( p ∗ V e r t e x ) Sum ( ) f l o a t 6 4 { return p .X + p .Y } f u n c main ( ) { p := new ( V e r t e x ) p . X = 3 ; p . Y=4 fmt . P r i n t l n ( p . Sum ( ) ) } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Métodos I También el receptor puede ser un valor y no un puntero I Usar un puntero sin embargo, evita copiar el valor entero y permite modificar el valor que el receptor apunta. type Vertex s t r u c t { X, Y f l o a t 6 4 } f u n c ( p V e r t e x ) Sum ( ) f l o a t 6 4 { return p .X + p .Y } f u n c main ( ) { p := new ( V e r t e x ) p . X = 3 ; p . Y=4 fmt . P r i n t l n ( p . Sum ( ) ) } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Goroutines I Una gorutina es un hilo (“thread”) que ejecuta en paralelo con otras gorutinas I Anteponer la palabra go a una función para correr esa función en una nueva gorutina Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Channels I Los canales son un conducto por el cual se puede enviar y recibir valores usando el operador canal (<-) I Los datos van en la dirección de la flecha I Un canal es creado usando make I Envíos y recepciones se bloquean hasta que el otro lado está listo ch := make ( chan i n t ) // un c a n a l de e n t e r o s ch <− v // e n v i a r v a l c a n a l ch v := <− ch // r e c i b e d e l c a n a l ch y a s i g n a e l v a l o r Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Buffered channels I Un canal puede tener un buffer. I Los envíos en un canal con buffer solo se bloquean si el buffer está lleno I Las recepciones se bloquean cuando el buffer está vacío ch := make ( chan i n t , 1 0 0 ) Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Range y Close I El que envía puede cerrar un canal para indicar que no enviará más valores I Usar range permite recibir valores del canal hasta que este sea cerrado f o r i := r a n g e ch Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Criba de números primos I Implementar la criba de Eratóstenes para obtener los números primos haciendo uso de gorutinas y canales Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Criba de números primos I Implementar la criba de Eratóstenes para obtener los números primos haciendo uso de gorutinas y canales f u n c g e n e r a r ( ) chan i n t { ch := make ( chan i n t ) go f u n c ( ) { f o r i :=2 ; ; i++ { ch<−i } }() r e t u r n ch } f u n c f i l t r a r ( i n chan i n t , p r i m e i n t ) chan i n t { o u t := make ( chan i n t ) go f u n c ( ) { for { i f i := <−i n ; i % p r i m e != 0 { out<−i } } }() r e t u r n out } Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Go web program I “Hello world from my Go program!” I Nos ayudaremos del paquete http Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Herramienta: gofmt I Permite formatear programas en Go I Se le pasa el archivo a formatear como parámetro I La bandera -w permite escribir el resultado en el archivo Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Herramienta: gomake I I La versión de make en go es gomake Se requieren los archivos: I I include ${GO_HOME}/go/src/Make.inc include ${GO_HOME}/go/src/Make.cmd Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go Gracias!!! Jorge Sebastian Hernández Domínguez Lenguaje de Programación: Go