Post on 16-Jun-2015
Goдля python-программистов
Константин Черкасовk.cherkasoff@gmail.com
Erlang?
Scala?
Scala + Akka?
Twisted?gevent?
Tornado?
Компьютеры изменились
• 2002 – Hyper-threading
• 2005 – 2 cores
• 2008 – 4 cores
• 2010 – 8 cores
• 2011 – 16 cores
• 2013 – 4 cores in a phone :)
Зачем?
Big Data
• 2005 – Data
• 2010 – Data
•2015 – DataОбъем данных удваивается каждые 18 месяцев
Что с языками программирования?
• С – 1972Разработка ядра и окружения ОС, переносимость кода между различными архитектурами
• С++ – 1980Расширение возможностей C («C с классами»)
• Java – 1995 (работа начата в 1990)ПО для бытовых устройств, за основу взят C++
Что с языками программирования?
• Perl – 1987comp.sources.misc: «замена для awk и sed»
• Python – 1991 (работа начата в 1989)Объектно-ориентированный скриптовый язык
• Ruby – 1994«Более объектно-ориентированный, чем Python»
• Javascript – 1995«язык для склеивания» веб-ресурсов, в том числе на стороне сервера
Go
Команда Go
Rob Pike Robert GriesemerKen Thompson
• Начали работу над Go в 2007 году
• Практики с огромным опытом (Unix, Plan 9, Inferno, B, UTF-8, V8, JVM HotSpot)
• Go задуман как инструмент для решения конкретных задач; это не академическое упражнение и не чья-то диссертация
• http://golang.org/CONTRIBUTORS – 400 человек
Что такое Go
• Компилируется в машинный код
• Объектно-ориентированный
• Есть понятие интерфейса• Нет классов
• Автоматическое управление памятью, сборщик мусора
• Императивный, с С-подобным синтаксисом
Что такое Go
• Строгая статическая типизация
• Нет неявного приведения типов• Утиная типизация и интерфейсы• Вывод типов
• Развитые средства интроспекции
• Поддержка Unicode
...
Что такое Go
• Развитые средства функционального программирования:
• 1st class functions• high order functions• function literals• closures• user-defined function types
...
Что такое Go
• Встроенная поддержка конкурентного программирования:
• Go-рутины• Инструкция go• Каналы и инструкция select
Что такое 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
Python vs Go
"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()
"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)}
array, slice
a := [...]string{"один", "два", "три", "четыре", "пять"}
Println(a) // [один два три четыре пять]Println(a[:2]) // [один два]Println(a[2:5]) // [три четыре пять]
map
m := map[string]int{"один": 1, "два": 2, "три": 3}
Println(m) // map[один:1 два:2 три:3]Println(m["один"], m["три"]) // 1 3
m["четыре"] = 4Println(m["четыре"]) // 4
for ... range
arr := [...]string{"один", "два", "три", "четыре", "пять"}
for i, v := range arr { Println(i, v)}
Культурные шоки
В 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
В Go нет классовв привычном нам виде
Gotype Point struct {! X float64! Y float64}
func (self Point) String() string {! return fmt.Sprintf("(%f, %f)", self.X, self.Y)}
В 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)
В 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
В 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
Текущий статус Go• Активно развивается: март 2012 – Go 1.0, май
2013 – Go 1.1, июнь 2013 – Go 1.1.1• Активное сообщество (G+, golang-nuts)
• Подробная документация и учебники
• Несколько книг, одна переведена на русский
Текущий статус Go• «Заряженная» стандартная библиотека
• Множство сторонних библиотек, коннекторы для всего (БД, серверов очередей и т.п.)
• Поддержка в Google App Engine
Текущий статус 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/
Области применения
• Сетевые сервисы, распределенные вычисления
• Go most watched repositories https://github.com/languages/Go/most_watched
• A list of Go projectshttps://code.google.com/p/go-wiki/wiki/Projects
Полезные ссылки• 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
Полезные ссылки
• What Python developers need to know before migrating to Gohttp://blog.repustate.com/migrating-code-from-python-to-golang-what-you-need-to-know/2013/04/23/
• Parallelism For The Win!http://areyoufuckingcoding.me/2012/08/16/parallelism-for-the-win/
• Rethinking Errors: Learning from Scala and Gohttp://youtu.be/REOL1AV_PCg
Полезные ссылки
• 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/
package main
import "fmt"
type Contact struct {! email string! skype string! facebook string}
func main() {! c := Contact{! ! email: "k.cherkasoff@gmail.com",! ! skype: "k.cherkasov",! ! facebook: "http://fb.com/k.cherkasoff",! }! fmt.Println(c)}