Язык программирования GO
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Язык программирования GO

  • 667 views
Uploaded on

Артем Первухин "Язык программирования GO" ...

Артем Первухин "Язык программирования GO"

В докладе будет рассказано, чем сможет заинтересовать Python-разработчика язык программирования Go. Будут описаны базовые идиомы языка Go и даны ответы на следующие вопросы: Насколько применим к Go "Zen of Python"? Какая у этого языка область применения? В чём можно выиграть, использовав Go вместо Python?

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
667
On Slideshare
660
From Embeds
7
Number of Embeds
1

Actions

Shares
Downloads
3
Comments
0
Likes
1

Embeds 7

https://twitter.com 7

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Язык программирования Go для программистов на Python 30.05.2014 Артём Первухин
  • 2. Почему Go? статическая типизация один файл на выходе конкурентность и масштабируемость
  • 3. Немного истории сентябрь 2007: идейное рождение (Robert Griesemer,Rob Pike,Ken Thompson) осень 2009: open source март 2012: Go 1.0 июнь 2014: Go 1.3
  • 4. What's in the box? golang.org(http://golang.org),дистрибутив Go 1.3 beta2 ~ 50 Мб компилятор стандартная библиотека документация всё для кросс-компиляции (amd64,i368,arm,*BSD,Linux,OS X,Windows) инструменты
  • 5. Некоторые команды godoc —документация в консоли или локальная копия golang.org go build —компиляция go install — компиляция и установка go run — компиляция и запуск отдельного файла go test —тесты,бенчмарки go fmt —получить красивый код go get — скачать по сети пакет,скомпилировать и установить
  • 6. Пакеты Установка пакета: go#get#github.com/artyom/ru Системы контроля версий: git,mercurial,bazaar,subversion package#main import#( ####"fmt" ####"github.com/artyom/ru" ) func#main()#{ ####num#:=#42 ####fmt.Println(num,#ru.Pluralize(num,#"питонов",#"питон",#"питона")) } Run
  • 7. Пакеты — размещение на диске Разные $GOPATH —аналоги разных virtualenv: $GOPATH ####bin/ ########doPsomethingPfun ####pkg/ ########darwin_amd64/ ############github.com/ ################user/ ####################coolstaff.a ####src/ ########github.com/ ############user/ ################coolstaff/ ####################common.go ####################items.go ####################smth.go ####################smth_test.go ####################doPsomethingPfun/ ########################code.go
  • 8. Don't communicate by sharing memory,share memory by communicating Горутины + каналы = concurrency func#worker(n,#delay#int,#res#chan#string)#{ ####fmt.Println("worker",#n,#"started") ####time.Sleep(time.Duration(delay)#*#time.Second) ####res$<&$fmt.Sprintf("result$from$worker$%d",$n) ####fmt.Println("hi#from#worker",#n) } func#main()#{ ####results$:=$make(chan$string) ####for#i#:=#1;#i#<#4;#i++#{ ########go#worker(i,#i+1,#results) ####} ####fmt.Println("waiting#for#all#workers") ####for#i#:=#1;#i#<#4;#i++#{ ########item$:=$<&results ########fmt.Println(item) ####} } Run
  • 9. Обработка последовательностей Python: list comprehensions map,reduce,filter Go: for for#...#range ####seasons#:=#[]string{"зима",#"весна",#"лето",#"осень"} ####for#i,#s#:=#range#seasons#{ ########fmt.Println(i,#s) ####} Run
  • 10. Обработка последовательностей #!/usr/bin/env#python move_month#=#lambda#y,m,x:#[((yP1,12),(y,m))[bool(m)]#for#y,m#in#[divmod(y*12+m+x,12)]][0] print#move_month(2013,#11,#+1) print#move_month(2013,#12,#+1) print#move_month(2014,#1,#P1) Run
  • 11. Обработка последовательностей
  • 12. Объектно-ориентированность
  • 13. Структуры и методы type#Person#struct#{ ####Name#######string ####Occupation#string } Методы — просто функции с получателем: func#(p#Person)#Title()#string#{ ####return#strings.Title(p.Name#+#",#"#+#p.Occupation) } (и никакого self!)
  • 14. Методы и структуры type#Person#struct#{ ####Name#######string ####Occupation#string } func#(p#Person)#Update(o#string)#{ ####p.Occupation#=#o } func#main()#{ ####ivan#:=#Person{ ########Name:#######"Иван#Васильевич#Бунша", ########Occupation:#"управдом", ####} ####fmt.Println(ivan.Title()) ####ivan.Update("великий$князь") ####fmt.Println(ivan.Title()) } Run
  • 15. Наследование?
  • 16. Встраивание! type#Parent#struct#{ ####Name####string ####Surname#string } type#Child#struct#{ ####Name###string ####Parent } func#main()#{ ####p#:=#Parent{"Sarah",#"Connor"} ####c$:=$Child{"John",$p} ####fmt.Println(c.Name,#c.Surname) ####c.Surname#=#"Doe" ####fmt.Println(c.Name,#c.Surname) } Run
  • 17. If it walks like a duck...
  • 18. Интерфейсы Python,PEP 3119,Introducing Abstract Base Classes: ...the ABCs define a minimal set of methods that establish the characteristic behavior of the type. Code that discriminates objects based on their ABC type can trust that those methods will always be present.
  • 19. Интерфейсы Go: интерфейсы —типы-обобщения,определяющие только набор методов. //#Reader#is#the#interface#that#wraps#the#basic#Read#method. type#Reader#interface#{ ####Read(p#[]byte)#(n#int,#err#error) } //#Writer#is#the#interface#that#wraps#the#basic#Write#method. type#Writer#interface#{ ####Write(p#[]byte)#(n#int,#err#error) } Интерфейсы + встраивание типов = комбинирование: //#ReadWriter#is#the#interface#that#groups#the#basic#Read#and#Write#methods. type#ReadWriter#interface#{ ####Reader ####Writer }
  • 20. Почти что декораторы def#memo(function): ####m#=#dict() ####def#wrapper(n): ########if#n#in#m: ############return#m[n] ########value#=#function(n) ########m[n]#=#value ########return#value ####return#wrapper @memo def#heavy(n): ####print("doing#complex#calculations") ####time.sleep(0.5) ####return#n+n if#__name__#==#"__main__": ####print(heavy(1)) ####print(heavy(2)) ####print(heavy(1)) ####print(heavy(2)) Run
  • 21. Почти что декораторы func#memo(f#func(int)#int)#func(int)#int#{ ####m#:=#make(map[int]int) ####return#func(n#int)#int#{ ########if#value,#ok#:=#m[n];#ok#{ ############return#value ########} ########value#:=#f(n) ########m[n]#=#value ########return#value ####} }
  • 22. Почти что декораторы (продолжение) (Привет,Python 2.3!) func#heavy(n#int)#int#{ ####fmt.Println("doing#complex#calculations") ####time.Sleep(500#*#time.Millisecond) ####return#n#+#n } var$cached$=$memo(heavy) func#main()#{ ####fmt.Println(cached(1)) ####fmt.Println(cached(2)) ####fmt.Println(cached(1)) ####fmt.Println(cached(2)) } Run
  • 23. *args,**kwargs
  • 24. Variadic functions func#Foo(prefix#string,#values#...int)#string func(string,#[]int)#string Примеры вызова: Foo("pref1") Foo("pref2",#1) Foo("pref3",#1,#2) values#:=#[]int{1,2,3,4,5} Foo("pref4",#values...)
  • 25. Ошибки file,#err#:=#os.Open("file.go") if#err#!=#nil#{ ####log.Fatal("failed#to#open#file",#err) } По типу функции явным образом понятно,может ли она вернуть ошибку: func#Open(name#string)#(file#*File,#err#error)
  • 26. defer — отложи на потом Python,менеджеры контекста: with#open("filename.txt",#"r")#as#inFile: ######do#something#with#file with#conn: ####conn.execute("insert#into#person(firstname)#values#(?)",#("Joe",)) Go,defer — откладывание исполнения функций «на потом»: f,#err#:=#os.Open("filename.txt") if#err#!=#nil#{ ####log.Fatal("failed#to#open#file",#err) } defer#f.Close() ...
  • 27. Документация Документация в виде комментариев перед кодом: //#Println#formats#using#the#default#formats#for#its#operands#and#writes#to#standard#output. //#Spaces#are#always#added#between#operands#and#a#newline#is#appended. //#It#returns#the#number#of#bytes#written#and#any#write#error#encountered. func#Println(a#...interface{})#(n#int,#err#error)#{ ####return#Fprintln(os.Stdout,#a...) } Чтение из консоли: $#godoc#fmt#Println func#Println(a#...interface{})#(n#int,#err#error) ####Println#formats#using#the#default#formats#for#its#operands#and#writes#to ####standard#output.#Spaces#are#always#added#between#operands#and#a#newline ####is#appended.#It#returns#the#number#of#bytes#written#and#any#write#error ####encountered. ☞ godoc#Psrc#... покажет и код
  • 28. Документация В html на сайте:
  • 29. Документация godoc.org(http://godoc.org)— документация на публично доступные пакеты.
  • 30. Batteries included
  • 31. Стандартная библиотека
  • 32. Стандартная библиотека Несколько примеров: strings regexp flag database/sql encoding/*,особенно encoding/json и encoding/xml net,net/http os/*и path/* text/template и html/template testing
  • 33. Стандартная библиотека: html/template O'Reilly:#How#are#<i>you</i>? Контекстно-зависимое автоматическое экранирование: Context##########################{{.}}#After {{.}}############################O'Reilly:#How#are#&lt;i&gt;you&lt;/i&gt;? <a#title='{{.}}'>################O&#39;Reilly:#How#are#you? <a#href="/{{.}}">################O&#39;Reilly:#How#are#%3ci%3eyou%3c/i%3e? <a#href="?q={{.}}">##############O&#39;Reilly%3a%20How%20are%3ci%3e...%3f <a#onx='f("{{.}}")'>#############Ox27Reilly:#How#are#x3cix3eyou...? <a#onx='f({{.}})'>###############"Ox27Reilly:#How#are#x3cix3eyou...?" <a#onx='pattern#=#/{{.}}/;'>#####Ox27Reilly:#How#are#x3cix3eyou...x3f
  • 34. Стандартная библиотека: testing $#ls#P1#*_test.go bench_test.go decode_test.go encode_test.go example_test.go fold_test.go scanner_test.go stream_test.go tagkey_test.go tags_test.go Тесты: func#TestMyFunction(t#*testing.T)#{ ####res#:=#MyFunction(1,#2) ####if#res#!=#3#{ ########t.Fatal("expecting#3,#got",#res) ####} }
  • 35. Стандартная библиотека: testing $#go#test# PASS ok######encoding/json####1.975s $#go#test#Pcover PASS coverage:#89.6%#of#statements ok######encoding/json####1.990s $#go#test#Pbench#. PASS BenchmarkCodeEncoder#########100######26941238#ns/op######72.03#MB/s BenchmarkCodeMarshal#########100######25133822#ns/op######77.21#MB/s BenchmarkCodeDecoder##########20######87467936#ns/op######22.18#MB/s BenchmarkCodeUnmarshal##########20######87582700#ns/op######22.16#MB/s BenchmarkCodeUnmarshalReuse##########20######82352420#ns/op BenchmarkUnmarshalString#####2000000###########776#ns/op BenchmarkUnmarshalFloat64#####5000000###########584#ns/op BenchmarkUnmarshalInt64#####5000000###########509#ns/op BenchmarkSkipValue##########50######21558521#ns/op######90.21#MB/s BenchmarkEncoderEncode#####2000000###########876#ns/op#########219#B/op###########2#allocs/op ok######encoding/json####26.096s
  • 36. Zen of...Go? The#Zen#of#Python,#by#Tim#Peters Beautiful#is#better#than#ugly. Explicit#is#better#than#implicit. Simple#is#better#than#complex. Complex#is#better#than#complicated. Flat#is#better#than#nested. Sparse#is#better#than#dense. Readability#counts. Special#cases#aren't#special#enough#to#break#the#rules. Although#practicality#beats#purity. Errors#should#never#pass#silently. Unless#explicitly#silenced. In#the#face#of#ambiguity,#refuse#the#temptation#to#guess. There#should#be#onePP#and#preferably#only#one#PPobvious#way#to#do#it. Although#that#way#may#not#be#obvious#at#first#unless#you're#Dutch. Now#is#better#than#never. Although#never#is#often#better#than#*right*#now. If#the#implementation#is#hard#to#explain,#it's#a#bad#idea. If#the#implementation#is#easy#to#explain,#it#may#be#a#good#idea. Namespaces#are#one#honking#great#idea#PP#let's#do#more#of#those!
  • 37. Ресурсы golang.org(http://golang.org) blog.golang.org(http://blog.golang.org) play.golang.org(http://play.golang.org) gobyexample.com(https://gobyexample.com) gophercon.com(http://gophercon.com) Twitter: Rob Pike @rob_pike(https://twitter.com/rob_pike) Brad Fitzpatrick @bradfitz(https://twitter.com/bradfitz) Andrew Gerrand @enneff(https://twitter.com/enneff) Russ Cox @_rsc(https://twitter.com/_rsc) Дмитрий Вьюков @dvyukov(https://twitter.com/dvyukov)
  • 38. Thank you Артём Первухин artyom@evasive.ru(mailto:artyom@evasive.ru) https://evasive.ru(https://evasive.ru)