SlideShare ist ein Scribd-Unternehmen logo
1 von 61
Downloaden Sie, um offline zu lesen
Кирил Владимиров
Python developer
Go fanboy
GitHub: Vladimiroff
Twitter: @K_Vladimiroff
Google I/O
15 май 2013
София
Малко история
Ken Thompson Rob 'Commander' Pike Robert Griesemer
Малко история
2007 стартира работата по проекта
Малко история
2007 стартира работата по проекта
2008 стартира имплементирането на компилатора
Малко история
2007 стартира работата по проекта
2008 стартира имплементирането на компилатора
2009 първи публичен релийз
Малко история
2007 стартира работата по проекта
2008 стартира имплементирането на компилатора
2009 първи публичен релийз
2010 обявен за език на годината от Tiobe
Малко история
2007 стартира работата по проекта
2008 стартира имплементирането на компилатора
2009 първи публичен релийз
2010 обявен за език на годината от Tiobe
2011 се използва в production среда от Google
Малко история
2007 стартира работата по проекта
2008 стартира имплементирането на компилатора
2009 първи публичен релийз
2010 обявен за език на годината от Tiobe
2011 се използва в production среда от Google
2012 официален релийз на 1.0
Малко история
2007 стартира работата по проекта
2008 стартира имплементирането на компилатора
2009 първи публичен релийз
2010 обявен за език на годината от Tiobe
2011 се използва в production среда от Google
2012 официален релийз на 1.0
2013 официален резлий на 1.1
C for the 21st
century
C for the 21st
century
C е на 41 години
C for the 21st
century
C е на 41 години
Хардуерът се променя непрекъсно
C for the 21st
century
C е на 41 години
Хардуерът се променя непрекъсно
Проблемите, които решаваме също
Три свята
Три свята
C/C++: Бързо изпълнение, за сметка бавна разработка, бавна компилация и
не особено тривиален контрол над зависимостите
Три свята
C/C++: Бързо изпълнение, за сметка бавна разработка, бавна компилация и
не особено тривиален контрол над зависимостите
Java/C#: По-ефективен процес на разработка, компилация и контрол над
зависимостите, за сметка на изпълнение
Три свята
C/C++: Бързо изпълнение, за сметка бавна разработка, бавна компилация и
не особено тривиален контрол над зависимостите
Java/C#: По-ефективен процес на разработка, компилация и контрол над
зависимостите, за сметка на изпълнение
Python/Ruby: Изключително ефективен процес на разработка, без стъпка на
компилация, но изключително бавно изпълнение
Три свята
C/C++: Бързо изпълнение, за сметка бавна разработка, бавна компилация и
не особено тривиален контрол над зависимостите
Java/C#: По-ефективен процес на разработка, компилация и контрол над
зависимостите, за сметка на изпълнение
Python/Ruby: Изключително ефективен процес на разработка, без стъпка на
компилация, но изключително бавно изпълнение
*: Трудна паралелизация и ефективност в мултипроцесорни системи
Резултатът
Език с отворен код от ниско ниво
Резултатът
Език с отворен код от ниско ниво
C-подобен синтаксис
Резултатът
Език с отворен код от ниско ниво
C-подобен синтаксис
package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
} else {
fmt.Printf("%g >= %gn", v, lim)
}
return lim
}
func main() {
fmt.Println(pow(3, 2, 10))
}
Резултатът
Език с отворен код от ниско ниво
C-подобен синтаксис
Дълбоко залегнала идея за конкурентност
Резултатът
Език с отворен код от ниско ниво
C-подобен синтаксис
Дълбоко залегнала идея за конкурентност
Вграден, бърз и ефективен garbage collector
Резултатът
Език с отворен код от ниско ниво
C-подобен синтаксис
Дълбоко залегнала идея за конкурентност
Вграден, бърз и ефективен garbage collector
Безумно бърза компилация
Резултатът
Език с отворен код от ниско ниво
C-подобен синтаксис
Дълбоко залегнала идея за конкурентност
Вграден, бърз и ефективен garbage collector
Безумно бърза компилация
Създаден да scale-ва
Резултатът
Език с отворен код от ниско ниво
C-подобен синтаксис
Дълбоко залегнала идея за конкурентност
Вграден, бърз и ефективен garbage collector
Безумно бърза компилация
Създаден да scale-ва
Изключително опростен
Резултатът
Език с отворен код от ниско ниво
C-подобен синтаксис
Дълбоко залегнала идея за конкурентност
Вграден, бърз и ефективен garbage collector
Безумно бърза компилация
Създаден да scale-ва
Изключително опростен
Забавен
Резултатът
Език с отворен код от ниско ниво
C-подобен синтаксис
Дълбоко залегнала идея за конкурентност
Вграден, бърз и ефективен garbage collector
Безумно бърза компилация
Създаден да scale-ва
Изключително опростен
Забавен … на моменти скучен
Epic features are epic
Модулната система
всичко е в пакет
в йерархия са
направени са като хората
import "log”
import googlelog "google/base/go/log"
НЕстандартни пакети
Колкото и да е пълна стандартната библиотека,
все ще ни се наложи нещо от вън
go get github.com/Vladimiroff/vec2d
import “github.com/Vladimiroff/vec2d”
var vector vec2d.Vector
Как да започнем
mkdir ~/go
export GOPATH=~/go
export PATH=$PATH:$GOROOT/bin
go/
├── bin
│ └── warcluster
├── pkg
│ └── linux_amd64
│ ├── code.google.com
│ ├── github.com
│ └── warcluster
└── src
├── github.com
│ ├── fzzy
│ │ └── sockjs-go
│ ├── garyburd
│ │ └── redigo
│ └── Vladimiroff
│ └── vec2d
└── warcluster
Обектният модел
Обектно-ориентиран, ама не точно...
Обектният модел
Composition not inheritance!
Обектният модел
без йерархия
Обектният модел
interfaces done right
Интерфейси
type Reader interface {
Read(b []byte) (n int, err error)
}
type Writer interface {
Write(b []byte) (n int, err error)
}
type ReadWriter interface {
Reader
Writer
}
Интерфейси
type Reader interface {
Read(b []byte) (n int, err error)
}
type Writer interface {
Write(b []byte) (n int, err error)
}
type ReadWriter interface {
Reader
Writer
}
If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.
Обектният модел
в този ред на мисли, няма методи
type ByteSlice []byte
func Append(slice *ByteSlice, data []byte) []byte {
// ...
}
Обектният модел
в този ред на мисли, няма методи
type ByteSlice []byte
func (self *ByteSlice) Append(data []byte) []byte {
// ...
}
ByteSlice.Append(data)
Tools
run
build
godoc
gofix
get
gofmt
tool
...
install
Стандартната библиотека
archive tar zip bufio builtin bytes compress bzip2 flate gzip lzw zlib
container heap list ring crypto aes cipher des dsa ecdsa elliptic
hmac md5 rand rc4 rsa sha1 sha256 sha512 subtle tls x509 pkix
database sql driver debug dwarf elf gosym macho pe encoding
ascii85 asn1 base32 base64 binary csv gob hex json pem xml
errors expvar flag fmt go ast build doc format parser printer
scanner token hash adler32 crc32 crc64 fnv html template image
color draw gif jpeg png index suffixarray io ioutil log syslog math big
cmplx rand mime multipart net http cgi cookiejar fcgi httptest
httputil pprof mail rpc jsonrpc smtp textproto url os exec signal
user path filepath reflect regexp syntax runtime cgo debug pprof
race sort strconv strings sync atomic syscall testing iotest quick text
scanner tabwriter template parse time unicode utf16 utf8 unsafe
Error handling
result, err := run()
няма изключения
type error interface {
Error() string
}
Да събудим perl-джии
от край време ни се обяснява как
регулярните изрази са бавни
Да събудим perl-джии
от край време ни се обяснява как
регулярните изрази са бавни
Regular Expression Matching Can Be Simple And Fast
(but is slow in Java, Perl, PHP, Python, Ruby, ...)
Russ Cox, 2007
Да събудим perl-джии
от край време ни се обяснява как
регулярните изрази са бавни
Regular Expression Matching Can Be Simple And Fast
(but is slow in Java, Perl, PHP, Python, Ruby, ...)
Russ Cox, 2007
Fun fact: Russ Cox става core-developer на Go, през 2009
Concurrency
Concurrency
закърмено с тази идея в builtins
Concurrency
закърмено с тази идея в builtins
Много нишки == много проблеми
Goroutines!
doSomething()
doAnototherThing()
go doYetAnorherThingButinGoroutine()
doOneMoreThing()
Channels
Channels
func makeCakeAndSend(cs chan string) {
for i := 1; i<=3; i++ {
cakeName := "Strawberry Cake " + strconv.Itoa(i)
fmt.Println("Making a cake and sending ...", cakeName)
cs <- cakeName //send a strawberry cake
}
}
func receiveCakeAndPack(cs chan string) {
for i := 1; i<=3; i++ {
s := <-cs //get whatever cake is on the channel
fmt.Println("Packing received cake: ", s)
}
}
func main() {
cs := make(chan string)
go makeCakeAndSend(cs)
go receiveCakeAndPack(cs)
time.Sleep(4 * 1e9)
}
Научените уроци
Научените уроци
unused variables unused modules
Научените уроци
unused variables unused modules
public and private
Научените уроци
unused variables unused modules
public and private
подредба в maps
Научените уроци
unused variables unused modules
public and private
подредба в maps
феноменална консистентност
Научените уроци
unused variables unused modules
public and private
подредба в maps
феноменална консистентност
без имплицитни кастове
Научените уроци
unused variables unused modules
public and private
подредба в maps
феноменална консистентност
без имплицитни кастове
UTF-8 FTW!
…
http://tour.golang.org/
въпроси?

Weitere ähnliche Inhalte

Ähnlich wie Why do we need a language like go?

Демо урок по програмиране със Светлин Наков
Демо урок по програмиране със Светлин НаковДемо урок по програмиране със Светлин Наков
Демо урок по програмиране със Светлин НаковSvetlin Nakov
 
Linux обновления с RAUC и Docker
Linux обновления с RAUC и DockerLinux обновления с RAUC и Docker
Linux обновления с RAUC и DockerLeon Anavi
 
HTML5 приложения за Android, урок 2
HTML5 приложения за Android, урок 2HTML5 приложения за Android, урок 2
HTML5 приложения за Android, урок 2Leon Anavi
 
Да заложим на Go
Да заложим на GoДа заложим на Go
Да заложим на GoZhivko Angelov
 
Направи си сам Raspberry Pi HAT
Направи си сам Raspberry Pi HATНаправи си сам Raspberry Pi HAT
Направи си сам Raspberry Pi HATLeon Anavi
 
JavaScript - езикът с много приложения
JavaScript - езикът с много приложенияJavaScript - езикът с много приложения
JavaScript - езикът с много приложенияStefan Krastev
 
Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11DAVID Academy
 
The Yocto Project
The Yocto ProjectThe Yocto Project
The Yocto ProjectLeon Anavi
 
Minimal linux live
Minimal linux liveMinimal linux live
Minimal linux liveIvan Davidov
 
[Verbose Bulgarian]joys and-woes_of_using_postman
[Verbose Bulgarian]joys and-woes_of_using_postman[Verbose Bulgarian]joys and-woes_of_using_postman
[Verbose Bulgarian]joys and-woes_of_using_postmanBorislav Traykov
 
Mozllla Labs presentation
Mozllla Labs presentationMozllla Labs presentation
Mozllla Labs presentationBogomil Shopov
 
Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13DAVID Academy
 
Memory problems in .NET apps
Memory problems in .NET appsMemory problems in .NET apps
Memory problems in .NET appsBorislav Ivanov
 
Grails for bored java developers by Emil Doychev
Grails for bored java developers by Emil DoychevGrails for bored java developers by Emil Doychev
Grails for bored java developers by Emil DoychevNayden Gochev
 

Ähnlich wie Why do we need a language like go? (20)

Демо урок по програмиране със Светлин Наков
Демо урок по програмиране със Светлин НаковДемо урок по програмиране със Светлин Наков
Демо урок по програмиране със Светлин Наков
 
Въведение в Perl
Въведение в PerlВъведение в Perl
Въведение в Perl
 
Linux обновления с RAUC и Docker
Linux обновления с RAUC и DockerLinux обновления с RAUC и Docker
Linux обновления с RAUC и Docker
 
HTML5 приложения за Android, урок 2
HTML5 приложения за Android, урок 2HTML5 приложения за Android, урок 2
HTML5 приложения за Android, урок 2
 
Да заложим на Go
Да заложим на GoДа заложим на Go
Да заложим на Go
 
Направи си сам Raspberry Pi HAT
Направи си сам Raspberry Pi HATНаправи си сам Raspberry Pi HAT
Направи си сам Raspberry Pi HAT
 
JavaScript - езикът с много приложения
JavaScript - езикът с много приложенияJavaScript - езикът с много приложения
JavaScript - езикът с много приложения
 
Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11
 
Expect4java
Expect4javaExpect4java
Expect4java
 
C++ OpenFest 2015
C++ OpenFest 2015C++ OpenFest 2015
C++ OpenFest 2015
 
Writing tests in Go
Writing tests in GoWriting tests in Go
Writing tests in Go
 
The Yocto Project
The Yocto ProjectThe Yocto Project
The Yocto Project
 
Minimal linux live
Minimal linux liveMinimal linux live
Minimal linux live
 
[Verbose Bulgarian]joys and-woes_of_using_postman
[Verbose Bulgarian]joys and-woes_of_using_postman[Verbose Bulgarian]joys and-woes_of_using_postman
[Verbose Bulgarian]joys and-woes_of_using_postman
 
Mozllla Labs presentation
Mozllla Labs presentationMozllla Labs presentation
Mozllla Labs presentation
 
Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13
 
Cross compiling
Cross compilingCross compiling
Cross compiling
 
Memory problems in .NET apps
Memory problems in .NET appsMemory problems in .NET apps
Memory problems in .NET apps
 
Embedded Gnu
Embedded GnuEmbedded Gnu
Embedded Gnu
 
Grails for bored java developers by Emil Doychev
Grails for bored java developers by Emil DoychevGrails for bored java developers by Emil Doychev
Grails for bored java developers by Emil Doychev
 

Why do we need a language like go?

  • 1. Кирил Владимиров Python developer Go fanboy GitHub: Vladimiroff Twitter: @K_Vladimiroff Google I/O 15 май 2013 София
  • 2. Малко история Ken Thompson Rob 'Commander' Pike Robert Griesemer
  • 3. Малко история 2007 стартира работата по проекта
  • 4. Малко история 2007 стартира работата по проекта 2008 стартира имплементирането на компилатора
  • 5. Малко история 2007 стартира работата по проекта 2008 стартира имплементирането на компилатора 2009 първи публичен релийз
  • 6. Малко история 2007 стартира работата по проекта 2008 стартира имплементирането на компилатора 2009 първи публичен релийз 2010 обявен за език на годината от Tiobe
  • 7. Малко история 2007 стартира работата по проекта 2008 стартира имплементирането на компилатора 2009 първи публичен релийз 2010 обявен за език на годината от Tiobe 2011 се използва в production среда от Google
  • 8. Малко история 2007 стартира работата по проекта 2008 стартира имплементирането на компилатора 2009 първи публичен релийз 2010 обявен за език на годината от Tiobe 2011 се използва в production среда от Google 2012 официален релийз на 1.0
  • 9. Малко история 2007 стартира работата по проекта 2008 стартира имплементирането на компилатора 2009 първи публичен релийз 2010 обявен за език на годината от Tiobe 2011 се използва в production среда от Google 2012 официален релийз на 1.0 2013 официален резлий на 1.1
  • 10. C for the 21st century
  • 11. C for the 21st century C е на 41 години
  • 12. C for the 21st century C е на 41 години Хардуерът се променя непрекъсно
  • 13. C for the 21st century C е на 41 години Хардуерът се променя непрекъсно Проблемите, които решаваме също
  • 15. Три свята C/C++: Бързо изпълнение, за сметка бавна разработка, бавна компилация и не особено тривиален контрол над зависимостите
  • 16. Три свята C/C++: Бързо изпълнение, за сметка бавна разработка, бавна компилация и не особено тривиален контрол над зависимостите Java/C#: По-ефективен процес на разработка, компилация и контрол над зависимостите, за сметка на изпълнение
  • 17. Три свята C/C++: Бързо изпълнение, за сметка бавна разработка, бавна компилация и не особено тривиален контрол над зависимостите Java/C#: По-ефективен процес на разработка, компилация и контрол над зависимостите, за сметка на изпълнение Python/Ruby: Изключително ефективен процес на разработка, без стъпка на компилация, но изключително бавно изпълнение
  • 18. Три свята C/C++: Бързо изпълнение, за сметка бавна разработка, бавна компилация и не особено тривиален контрол над зависимостите Java/C#: По-ефективен процес на разработка, компилация и контрол над зависимостите, за сметка на изпълнение Python/Ruby: Изключително ефективен процес на разработка, без стъпка на компилация, но изключително бавно изпълнение *: Трудна паралелизация и ефективност в мултипроцесорни системи
  • 19. Резултатът Език с отворен код от ниско ниво
  • 20. Резултатът Език с отворен код от ниско ниво C-подобен синтаксис
  • 21. Резултатът Език с отворен код от ниско ниво C-подобен синтаксис package main import ( "fmt" "math" ) func pow(x, n, lim float64) float64 { if v := math.Pow(x, n); v < lim { return v } else { fmt.Printf("%g >= %gn", v, lim) } return lim } func main() { fmt.Println(pow(3, 2, 10)) }
  • 22. Резултатът Език с отворен код от ниско ниво C-подобен синтаксис Дълбоко залегнала идея за конкурентност
  • 23. Резултатът Език с отворен код от ниско ниво C-подобен синтаксис Дълбоко залегнала идея за конкурентност Вграден, бърз и ефективен garbage collector
  • 24. Резултатът Език с отворен код от ниско ниво C-подобен синтаксис Дълбоко залегнала идея за конкурентност Вграден, бърз и ефективен garbage collector Безумно бърза компилация
  • 25. Резултатът Език с отворен код от ниско ниво C-подобен синтаксис Дълбоко залегнала идея за конкурентност Вграден, бърз и ефективен garbage collector Безумно бърза компилация Създаден да scale-ва
  • 26. Резултатът Език с отворен код от ниско ниво C-подобен синтаксис Дълбоко залегнала идея за конкурентност Вграден, бърз и ефективен garbage collector Безумно бърза компилация Създаден да scale-ва Изключително опростен
  • 27. Резултатът Език с отворен код от ниско ниво C-подобен синтаксис Дълбоко залегнала идея за конкурентност Вграден, бърз и ефективен garbage collector Безумно бърза компилация Създаден да scale-ва Изключително опростен Забавен
  • 28. Резултатът Език с отворен код от ниско ниво C-подобен синтаксис Дълбоко залегнала идея за конкурентност Вграден, бърз и ефективен garbage collector Безумно бърза компилация Създаден да scale-ва Изключително опростен Забавен … на моменти скучен
  • 30. Модулната система всичко е в пакет в йерархия са направени са като хората import "log” import googlelog "google/base/go/log"
  • 31. НЕстандартни пакети Колкото и да е пълна стандартната библиотека, все ще ни се наложи нещо от вън go get github.com/Vladimiroff/vec2d import “github.com/Vladimiroff/vec2d” var vector vec2d.Vector
  • 32. Как да започнем mkdir ~/go export GOPATH=~/go export PATH=$PATH:$GOROOT/bin go/ ├── bin │ └── warcluster ├── pkg │ └── linux_amd64 │ ├── code.google.com │ ├── github.com │ └── warcluster └── src ├── github.com │ ├── fzzy │ │ └── sockjs-go │ ├── garyburd │ │ └── redigo │ └── Vladimiroff │ └── vec2d └── warcluster
  • 37. Интерфейси type Reader interface { Read(b []byte) (n int, err error) } type Writer interface { Write(b []byte) (n int, err error) } type ReadWriter interface { Reader Writer }
  • 38. Интерфейси type Reader interface { Read(b []byte) (n int, err error) } type Writer interface { Write(b []byte) (n int, err error) } type ReadWriter interface { Reader Writer } If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.
  • 39. Обектният модел в този ред на мисли, няма методи type ByteSlice []byte func Append(slice *ByteSlice, data []byte) []byte { // ... }
  • 40. Обектният модел в този ред на мисли, няма методи type ByteSlice []byte func (self *ByteSlice) Append(data []byte) []byte { // ... } ByteSlice.Append(data)
  • 42. Стандартната библиотека archive tar zip bufio builtin bytes compress bzip2 flate gzip lzw zlib container heap list ring crypto aes cipher des dsa ecdsa elliptic hmac md5 rand rc4 rsa sha1 sha256 sha512 subtle tls x509 pkix database sql driver debug dwarf elf gosym macho pe encoding ascii85 asn1 base32 base64 binary csv gob hex json pem xml errors expvar flag fmt go ast build doc format parser printer scanner token hash adler32 crc32 crc64 fnv html template image color draw gif jpeg png index suffixarray io ioutil log syslog math big cmplx rand mime multipart net http cgi cookiejar fcgi httptest httputil pprof mail rpc jsonrpc smtp textproto url os exec signal user path filepath reflect regexp syntax runtime cgo debug pprof race sort strconv strings sync atomic syscall testing iotest quick text scanner tabwriter template parse time unicode utf16 utf8 unsafe
  • 43. Error handling result, err := run() няма изключения type error interface { Error() string }
  • 44. Да събудим perl-джии от край време ни се обяснява как регулярните изрази са бавни
  • 45. Да събудим perl-джии от край време ни се обяснява как регулярните изрази са бавни Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, ...) Russ Cox, 2007
  • 46. Да събудим perl-джии от край време ни се обяснява как регулярните изрази са бавни Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, ...) Russ Cox, 2007 Fun fact: Russ Cox става core-developer на Go, през 2009
  • 49. Concurrency закърмено с тази идея в builtins Много нишки == много проблеми Goroutines! doSomething() doAnototherThing() go doYetAnorherThingButinGoroutine() doOneMoreThing()
  • 51. Channels func makeCakeAndSend(cs chan string) { for i := 1; i<=3; i++ { cakeName := "Strawberry Cake " + strconv.Itoa(i) fmt.Println("Making a cake and sending ...", cakeName) cs <- cakeName //send a strawberry cake } } func receiveCakeAndPack(cs chan string) { for i := 1; i<=3; i++ { s := <-cs //get whatever cake is on the channel fmt.Println("Packing received cake: ", s) } } func main() { cs := make(chan string) go makeCakeAndSend(cs) go receiveCakeAndPack(cs) time.Sleep(4 * 1e9) }
  • 54. Научените уроци unused variables unused modules public and private
  • 55. Научените уроци unused variables unused modules public and private подредба в maps
  • 56. Научените уроци unused variables unused modules public and private подредба в maps феноменална консистентност
  • 57. Научените уроци unused variables unused modules public and private подредба в maps феноменална консистентност без имплицитни кастове
  • 58. Научените уроци unused variables unused modules public and private подредба в maps феноменална консистентност без имплицитни кастове UTF-8 FTW!
  • 59.
  • 60.