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