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