40
Go для python-программистов Константин Черкасов [email protected]

Go для python-программистов

Embed Size (px)

Citation preview

Page 1: Go для python-программистов

Goдля python-программистов

Константин Черкасов[email protected]

Page 2: Go для python-программистов
Page 3: Go для python-программистов

Erlang?

Page 4: Go для python-программистов

Scala?

Page 5: Go для python-программистов

Scala + Akka?

Page 6: Go для python-программистов

Twisted?gevent?

Tornado?

Page 7: Go для python-программистов

Компьютеры изменились

• 2002 – Hyper-threading

• 2005 – 2 cores

• 2008 – 4 cores

• 2010 – 8 cores

• 2011 – 16 cores

• 2013 – 4 cores in a phone :)

Page 8: Go для python-программистов

Зачем?

Page 9: Go для python-программистов

Big Data

• 2005 – Data

• 2010 – Data

•2015 – DataОбъем данных удваивается каждые 18 месяцев

Page 10: Go для python-программистов

Что с языками программирования?

• С – 1972Разработка ядра и окружения ОС, переносимость кода между различными архитектурами

• С++ – 1980Расширение возможностей C («C с классами»)

• Java – 1995 (работа начата в 1990)ПО для бытовых устройств, за основу взят C++

Page 11: Go для python-программистов

Что с языками программирования?

• Perl – 1987comp.sources.misc: «замена для awk и sed»

• Python – 1991 (работа начата в 1989)Объектно-ориентированный скриптовый язык

• Ruby – 1994«Более объектно-ориентированный, чем Python»

• Javascript – 1995«язык для склеивания» веб-ресурсов, в том числе на стороне сервера

Page 12: Go для python-программистов
Page 13: Go для python-программистов

Go

Page 14: Go для python-программистов

Команда Go

Rob Pike Robert GriesemerKen Thompson

• Начали работу над Go в 2007 году

• Практики с огромным опытом (Unix, Plan 9, Inferno, B, UTF-8, V8, JVM HotSpot)

• Go задуман как инструмент для решения конкретных задач; это не академическое упражнение и не чья-то диссертация

• http://golang.org/CONTRIBUTORS – 400 человек

Page 15: Go для python-программистов

Что такое Go

• Компилируется в машинный код

• Объектно-ориентированный

• Есть понятие интерфейса• Нет классов

• Автоматическое управление памятью, сборщик мусора

• Императивный, с С-подобным синтаксисом

Page 16: Go для python-программистов

Что такое Go

• Строгая статическая типизация

• Нет неявного приведения типов• Утиная типизация и интерфейсы• Вывод типов

• Развитые средства интроспекции

• Поддержка Unicode

...

Page 17: Go для python-программистов

Что такое Go

• Развитые средства функционального программирования:

• 1st class functions• high order functions• function literals• closures• user-defined function types

...

Page 18: Go для python-программистов

Что такое Go

• Встроенная поддержка конкурентного программирования:

• Go-рутины• Инструкция go• Каналы и инструкция select

Page 19: Go для python-программистов

Что такое Gofunc main() {! go boring("boring!")! fmt.Println("I'm listening")! time.Sleep(2 * time.Second)! fmt.Println("You're boring; I'm leaving.")}

func boring(msg string) {! for i := 0; ; i++ {! ! fmt.Println(msg, i)! ! time.Sleep(1 * time.Second)! }}

Go Concurrency Patternsyoutu.be/f6kdp27TYZs

Page 20: Go для python-программистов

Python vs Go

Page 21: Go для python-программистов

"Hello, world" на Tornado

import tornado.ioloopimport tornado.web

class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world")

application = tornado.web.Application([ (r"/", MainHandler),])

if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()

Page 22: Go для python-программистов

"Hello, world" на Go

package main

import "net/http"

func MainHandler(resp http.ResponseWriter, _ *http.Request) {! resp.Write([]byte("Hello, world!"))}

func main() {! http.HandleFunc("/", MainHandler)! http.ListenAndServe(":8080", nil)}

Page 23: Go для python-программистов

array, slice

a := [...]string{"один", "два", "три", "четыре", "пять"}

Println(a) // [один два три четыре пять]Println(a[:2]) // [один два]Println(a[2:5]) // [три четыре пять]

Page 24: Go для python-программистов

map

m := map[string]int{"один": 1, "два": 2, "три": 3}

Println(m) // map[один:1 два:2 три:3]Println(m["один"], m["три"]) // 1 3

m["четыре"] = 4Println(m["четыре"]) // 4

Page 25: Go для python-программистов

for ... range

arr := [...]string{"один", "два", "три", "четыре", "пять"}

for i, v := range arr { Println(i, v)}

Page 26: Go для python-программистов

Культурные шоки

Page 27: Go для python-программистов

В Go нет классовв привычном нам виде

class Point(object):! def __init__(self, X, Y):! ! self.X = X! ! self.Y = Y

! def __str__(self):! ! return "(%f, %f)"%(self.X, self.Y)

Python

Page 28: Go для python-программистов

В Go нет классовв привычном нам виде

Gotype Point struct {! X float64! Y float64}

func (self Point) String() string {! return fmt.Sprintf("(%f, %f)", self.X, self.Y)}

Page 29: Go для python-программистов

В Go нет классовв привычном нам виде

Gotype Point struct {! X float64! Y float64}

func (self Point) String() string {! return fmt.Sprintf("(%f, %f)", self.X, self.Y)}

def __str__(self)

Page 30: Go для python-программистов

В Go нет исключенийв привычном нам виде

file, err := os.Open("filename.ext")if err != nil { log.Fatal(err)}// do something with the open *File f

«Ошибка» – это альтернативный результат

Error Handling and Gohttp://golang.org/doc/articles/error_handling.html

Page 31: Go для python-программистов

В Go нет исключенийв привычном нам виде

Для аварий – panic & recoverfunc g(i int) { if i > 3 { panic(fmt.Sprintf("Too large: %v", i)) }

Defer, Panic, and Recoverhttp://golang.org/doc/articles/defer_panic_recover.html

Page 32: Go для python-программистов

Текущий статус Go• Активно развивается: март 2012 – Go 1.0, май

2013 – Go 1.1, июнь 2013 – Go 1.1.1• Активное сообщество (G+, golang-nuts)

• Подробная документация и учебники

• Несколько книг, одна переведена на русский

Page 33: Go для python-программистов

Текущий статус Go• «Заряженная» стандартная библиотека

• Множство сторонних библиотек, коннекторы для всего (БД, серверов очередей и т.п.)

• Поддержка в Google App Engine

Page 34: Go для python-программистов

Текущий статус Go

• Gorilla web toolkithttp://www.gorillatoolkit.org/

• BeegoBeego is a Go Framework which is inspired from tornado and sinatrahttps://github.com/astaxie/beego

• RevelA high productivity web framework for the Go language, in the spirit of Rails and Play!http://robfig.github.io/revel/

Page 35: Go для python-программистов

Области применения

• Сетевые сервисы, распределенные вычисления

• Go most watched repositories https://github.com/languages/Go/most_watched

• A list of Go projectshttps://code.google.com/p/go-wiki/wiki/Projects

Page 36: Go для python-программистов

Полезные ссылки• Go Concurrency Patterns

http://youtu.be/f6kdp27TYZs

• Advanced Go Concurrency Patternshttp://youtu.be/QDDwwePbDtw

• Concurrency Is Not Parallelismhttp://vimeo.com/49718712

• Meet the Go Teamhttp://youtu.be/sln-gJaURzk

• Fireside Chat with the Go Teamhttp://youtu.be/p9VUCp98ay4

Page 38: Go для python-программистов

Полезные ссылки

• Why Python, Ruby and Javascript are Slowhttps://vimeo.com/61044810

• Scala Actors 101 - Threadless and Scalablehttp://java.dzone.com/articles/scala-threadless-concurrent

• Concurrency in Erlang & Scala: The Actor Modelhttp://savanne.be/articles/concurrency-in-erlang-scala/

Page 39: Go для python-программистов
Page 40: Go для python-программистов

package main

import "fmt"

type Contact struct {! email string! skype string! facebook string}

func main() {! c := Contact{! ! email: "[email protected]",! ! skype: "k.cherkasov",! ! facebook: "http://fb.com/k.cherkasoff",! }! fmt.Println(c)}