Go python, go

Embed Size (px)

Citation preview

Click to edit the title text format

Go Python, Go
Un pantallazo de los atributos de Go para alguien que viene de python.

Presentado porSergio [email protected]@sergiusenswww.canonical.comDiciembre 2015

Sobre mi

Crdoba Argentina

Ubuntu Core: snappy y snapcraft

Aikido, correr, trekking, ser padre y pareja

Donde

Trabajo

Recreacin

Antes estaba en phone foundations.Mis responsabilidades:- snappy: diseo y desarrollo- ubuntu-device-flash- oem- webdm- bootloaders

En foundations:- storage- mms- notificaciones- portar/integrar

Agenda

Ejemplo obligatorio.

Como trabajo y como se compara con Python.

Comparativo de como manejar ciertos constructs.

Hola Mundo

Herramientas

Cdigo

Antes estaba en phone foundations.Mis responsabilidades:- snappy: diseo y desarrollo- ubuntu-device-flash- oem- webdm- bootloaders

En foundations:- storage- mms- notificaciones- portar/integrar

Hola Mundo

Herramientas

Donde trabajo

GOPATH compartido entre todos los proyectos

Un GOPATH por proyecto

Vendoring, usando cosas como http://getgb.io

GOPATH

Como venv, pero mandatorio.

distros son una forma de vendoring.

Usar go para trabajar con Go

go get

En vez de hacer $ pip install galileoHacemos $ go get github.com/mvo5/godd

El deploy se reduce a copiar el binariogo getgo testgo install

gofmtgodocgo vetgoimports

Cdigo

Confusin entre snappy y Ubuntu Core

Ubuntu no es apt como Ubuntu Core no es snappy

Asignar/Inicializar

Pythona = hellob = 1a = 2

Goa := hellob := 1a = 2

Tambien se puede ser explcitovar c string = stringvar d uint32 = 32

./a.go:9: cannot use 2 (type int) as type string in assignment

Condicionales

Pythona = 1if a:elif n is None:

Goa := 1if a == 1 {else if n == nil {

Unicamente expresiones booleanas o booleanos.

No puede pasar en Go

Hay que tener tests para estar seguro de no tener typosname = 'pythonista'

if random.random() > 0.5: print('hola {}!'.format(name))else print('chau {}'.format(nane))

Slices

Pythona = [1, 2, 4, 5]a.append(6)a.extend([7, 8])a.insert(2, 3) # o a[2:1] = [3]x = a.pop()

Goa := []int{1, 2, 4, 5}a = append(a, 6)a = append(a, []int{7, 8}) // !!a = append(a[:1], append([]int{3}, a[1:]...)...)x, a := a[len(a)-1], a[:len(a)-1]

Como se la capacidad de ante mano podra haber hechoa := make([]int, 0, 8)

Insertar requiere crear un nuevo slice all que se hace appendHay otra forma usando copySlices tienen capacidad y longitud

Mapas

Pythona = {'1': '1', '2': 2}a['1']'1' in alen(a)del a['1']

Goa := map[string]int{1: 1, 2: 2}a[1]_, ok := a[1] // value, ok := a[1]len(a)delete(a, 1)

delete no hace nada si el key no existe.se puede como en python, pero con interfaces y reflection.

Loops

Pythonfor item in items: print(item)

Gofor i, item := range items { fmt.Println(item) fmt.Println(items[i])}

for key, value := range myMap { fmt.Println(key, value) fmt.Println(key, myMap[key])

}

for i := 0; i < 10; i++ { fmt.Println(i)}

Los caminos no deseados

Pythondef bad_boy(): raise RuntimeException('I am bad')

try: bad_boy()except RuntimeException: # por que se porto mal? pass

Gofunc badBoy() error { return errors.New(I am bad)}

if err := badBoy(); err != nil { # por que se porto mal?}

Clases? Objetos?

Pythonclass A: def __init__(self, name): self._name = name def __str__(self): return self._name

print(A(name='me'))

Gotype A struct { name string

}

func (a A) String() string { return a.name}

fmt.Println(A{name: you})

Interfaces

Pythonclass Duckling(A): def quack(self): print('quack') if random() > 0.5: return [1, 2, 3] else: return 'quacked'

def do_duck(looks_like_a_duck): looks_like_a_duck.quack() if random() > 0.5: looks_like_a_duck.walk()

Gotype Duck interface { quack() walk()

}

type Duckling struct{}

func (d Duckling) quack() { fmt.Println(quack)}

func (d Duckling) walk() { fmt.Println(walk)}

func do_duck(duck Duck) { duck.quack() duck.walk()

}

En python no me entero de que significa parecerse a un pato hasta que explota en runtime (y por el random se complica).En Go es explicito el valor de retornoMostrar errores como interfazMostrar string como interfaz

Acceso

Python_privado = 1publico = 2

class _Privado: def _metodo_privado(self): pass

class Publico(A): def metodo_publico(self): pass

def funcion_publica(): pass

def _funcion_privada(): pass

Govar privado intvar Publico int

type privado struct{}

func (x privado) receiver_privado() {}

type Publico struct{}

func (x Publico) ReceiverPublico() {}

func FuncionPublico() {}

func main() // !!

Contextos

Pythondef read(f): return yaml.load(f)

def main(): with open('file') as f: return read(f)

Gotype data struct { Name string}

func read(r io.Reader) (data, error) { b, _ := ioutil.ReadAll(r) // !! var d data yaml.Unmarshal(b, &d) // !! return d, nil}

func main() {

f, _ := os.Open(file) // !! defer f.Close() data, _ := read(f) // !! fmt.Printf(%#v\n, data)}

Es Name para que este exportado, reflectionIgnoro los errores...

Generadores, canales y concurrencia

Pythondef fib(n): a, b = 0, 1 for i in range(n): a, b = b, a + b yield a

for x in fib(10): print(x)

Gofunc fib(n int) chan int { c := make(chan int) go func() { a, b := 0, 1 for i := 0; i < n; i++ { a, b = b, a+b c