Lenguaje de Programación: Go

Anuncio
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
Descargar