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

1,787 views

Published on

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

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,787
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. Язык программирования Go для программистов на Python 30.05.2014 Артём Первухин
  2. 2. Почему Go? статическая типизация один файл на выходе конкурентность и масштабируемость
  3. 3. Немного истории сентябрь 2007: идейное рождение (Robert Griesemer,Rob Pike,Ken Thompson) осень 2009: open source март 2012: Go 1.0 июнь 2014: Go 1.3
  4. 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. 5. Некоторые команды godoc —документация в консоли или локальная копия golang.org go build —компиляция go install — компиляция и установка go run — компиляция и запуск отдельного файла go test —тесты,бенчмарки go fmt —получить красивый код go get — скачать по сети пакет,скомпилировать и установить
  6. 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. 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. 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. 9. Обработка последовательностей Python: list comprehensions map,reduce,filter Go: for for#...#range ####seasons#:=#[]string{"зима",#"весна",#"лето",#"осень"} ####for#i,#s#:=#range#seasons#{ ########fmt.Println(i,#s) ####} Run
  10. 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. 11. Обработка последовательностей
  12. 12. Объектно-ориентированность
  13. 13. Структуры и методы type#Person#struct#{ ####Name#######string ####Occupation#string } Методы — просто функции с получателем: func#(p#Person)#Title()#string#{ ####return#strings.Title(p.Name#+#",#"#+#p.Occupation) } (и никакого self!)
  14. 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. 15. Наследование?
  16. 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. 17. If it walks like a duck...
  18. 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. 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. 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. 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. 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. 23. *args,**kwargs
  24. 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. 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. 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. 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. 28. Документация В html на сайте:
  29. 29. Документация godoc.org(http://godoc.org)— документация на публично доступные пакеты.
  30. 30. Batteries included
  31. 31. Стандартная библиотека
  32. 32. Стандартная библиотека Несколько примеров: strings regexp flag database/sql encoding/*,особенно encoding/json и encoding/xml net,net/http os/*и path/* text/template и html/template testing
  33. 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'Reilly:#How#are#you? <a#href="/{{.}}">################O'Reilly:#How#are#%3ci%3eyou%3c/i%3e? <a#href="?q={{.}}">##############O'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. 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. 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. 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. 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. 38. Thank you Артём Первухин artyom@evasive.ru(mailto:artyom@evasive.ru) https://evasive.ru(https://evasive.ru)

×