Está en la página 1de 44

Lenguaje de Programacin: Go

Jorge Sebastian Hernndez Domnguez

Centro de Investigacin y de Estudios Avanzados del I.P.N

9 de Noviembre de 2011

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go


Go

I Es un lenguaje de programacin de propsito general que es


promovido por: Rob Pike, Robert Griesemer, Ken Thompson,
Russ Cox, Ian Lance Taylor. Todos ellos de Google
I Go tiene las siguientes caractersticas:
I Lenguaje compilado
I Tipado esttico
I Rpido
I Soporte de concurrencia
I Open Source
I Pgina web: http://golang.org

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go


Go

I Existen dos compiladores para Go:


I Gccgo - Basado en GCC
I Suite 6g, 8g, etc. (Dependiendo de la arquitectura)

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go


Hello world!

I Cada cdigo fuente declara el paquete al que pertenece


(main), adems de los paquetes a usar (fmt)
I Funciones se declaran con func
I Comentarios:
I /* comentario multilnea */
I // comentario una lnea
I 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 Hernndez Domnguez Lenguaje de Programacin: 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 Hernndez Domnguez Lenguaje de Programacin: Go


Asignacin mltiple

I Go permite hacer asignacin mltiple


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 Hernndez Domnguez Lenguaje de Programacin: Go


Funciones

I El tipo se pone despus del nombre de la variable


I Cuando dos o ms parmetros son del mismo tipo solo es
necesario el tipo en el ltimo parmetro

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 Hernndez Domnguez Lenguaje de Programacin: Go


Funciones

I Una funcin puede regresar cualquier nmero 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 Hernndez Domnguez Lenguaje de Programacin: Go


Asignacin corta

I Dentro de una funcin, se puede usar := en lugar de var

x := 1
y , z := 2 , 3

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go


Constantes

I Se utiliza la palabra reservada const.


I Pueden ser string, booleanos o numricos.
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 Hernndez Domnguez Lenguaje de Programacin: Go


For

I Solo existe una estructura para los ciclos en Go (for).


I No se usan parntesis 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 Hernndez Domnguez Lenguaje de Programacin: Go


If

I No se usan parntesis y las llaves son obligatorias.


I Tambin puede agregarse una sentencia antes de la condicin

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 Hernndez Domnguez Lenguaje de Programacin: Go


Defer

I Defer ejecuta una funcin cuando la funcin 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 Hernndez Domnguez Lenguaje de Programacin: Go


Ejercicio: Defer
I Cul 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 Hernndez Domnguez Lenguaje de Programacin: Go
Structs

I Es una coleccin 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 Hernndez Domnguez Lenguaje de Programacin: Go


Structs

I Se puede asignar un subconjunto de campos usando la


notacin campo:valor
I El prefijo & construye un puntero a la estructura

var (
p = V e r t e x { 1 , 2} // tipo Vertex
q = &V e r t e x { 1 , 2} // tipo Vertex
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
)

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go


New

I La expresin 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 Hernndez Domnguez Lenguaje de Programacin: 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 Hernndez Domnguez Lenguaje de Programacin: Go


Arreglos

I Si pasamos un arreglo a una funcin, este recibe una copia del


arreglo y no un puntero a este.
I Sin embargo, tambin podemos usar la direccin 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 Hernndez Domnguez Lenguaje de Programacin: Go


Ejercicio: Invertir un arreglo

I Implemente una funcin que invierta un arreglo


I Utilice la asignacin mltiple

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go


Ejercicio: Invertir un arreglo

I Implemente una funcin que invierta un arreglo


I Utilice la asignacin mltiple

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 Hernndez Domnguez Lenguaje de Programacin: 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 Hernndez Domnguez Lenguaje de Programacin: 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 Hernndez Domnguez Lenguaje de Programacin: Go


Volviendo a Slices

I Un slice tiene largo y capacidad


I La capacidad de un slice es el mximo tamao que esta puede
crecer
I La capacidad se puede indicar con un tercer parmetro 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 Hernndez Domnguez Lenguaje de Programacin: 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 Hernndez Domnguez Lenguaje de Programacin: Go


Maps

I Para probar si una llave esta presente en un mapa se usa una


asignacin mltiple

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 Hernndez Domnguez Lenguaje de Programacin: Go


Function full closures

I Un closure es una funcin que incluye el contexto en el que fue


definida.
I Por ende, puede referenciar variables de dicho contexto

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: 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 Hernndez Domnguez Lenguaje de Programacin: Go


Ejercicio: Fibonacci closure

I Utilizando closures implemente una funcin que obtenga una


serie de nmeros Fibonacci

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go


Ejercicio: Fibonacci closure

I Utilizando closures implemente una funcin que obtenga una


serie de nmeros 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 Hernndez Domnguez Lenguaje de Programacin: 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 Hernndez Domnguez Lenguaje de Programacin: Go


Switch

I Cada caso se interrumpe (breaks) automticamente 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 Hernndez Domnguez Lenguaje de Programacin: Go


Mtodos

I Go no tienes clases, pero se pueden definir mtodos 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 Hernndez Domnguez Lenguaje de Programacin: Go


Mtodos

I Tambin 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 Hernndez Domnguez Lenguaje de Programacin: Go


Goroutines

I Una gorutina es un hilo (thread) que ejecuta en paralelo con


otras gorutinas
I Anteponer la palabra go a una funcin para correr esa funcin
en una nueva gorutina

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: 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 direccin de la flecha
I Un canal es creado usando make
I Envos 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 Hernndez Domnguez Lenguaje de Programacin: Go


Buffered channels

I Un canal puede tener un buffer.


I Los envos en un canal con buffer solo se bloquean si el buffer
est lleno
I Las recepciones se bloquean cuando el buffer est vaco

ch := make ( chan i n t , 1 0 0 )

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go


Range y Close

I El que enva puede cerrar un canal para indicar que no enviar


ms 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 Hernndez Domnguez Lenguaje de Programacin: Go


Criba de nmeros primos
I Implementar la criba de Eratstenes para obtener los nmeros
primos haciendo uso de gorutinas y canales

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go


Criba de nmeros primos
I Implementar la criba de Eratstenes para obtener los nmeros
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 Hernndez Domnguez Lenguaje de Programacin: Go
Go web program

I Hello world from my Go program!


I Nos ayudaremos del paquete http

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go


Herramienta: gofmt

I Permite formatear programas en Go


I Se le pasa el archivo a formatear como parmetro
I La bandera -w permite escribir el resultado en el archivo

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go


Herramienta: gomake

I La versin de make en go es gomake


I Se requieren los archivos:
I include ${GO_HOME}/go/src/Make.inc
I include ${GO_HOME}/go/src/Make.cmd

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go


Gracias!!!

Jorge Sebastian Hernndez Domnguez Lenguaje de Programacin: Go

También podría gustarte