If you can't read please download the document
Upload
sergio-schvezov
View
222
Download
0
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