Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Go Programlama Dili - Seminer

181 views

Published on

Bu seminerde Go programlama diline hızlı bir bakış attık. 2017'de verdiğim Go seminerinin bağlantısına da bu sunumun kaynaklar kısmından ulaşabilirsiniz.

www.cihanozhan.com
www.deeplab.co
www.darkfactory.co

Published in: Technology
  • Be the first to comment

Go Programlama Dili - Seminer

  1. 1. Go Programlama Dili www.cihanozhan.com
  2. 2. Go Nedir? • Açık kaynak kodlu, sade ve güçlü bir programlama dilidir. • Google tarafından, kendi altyapı sorunlarını çözmek için geliştirildi. • Ken Thompson, Rob Pike ve Robert Griesiemer tarafından 2007 yılında geliştirilmeye başlandı. • 10 Kasım 2009 yılında tanıtıldı ve 28 Mart 2012’de Go 1.0 yayınlandı. • Mevcut Go versiyonu Go 1.13. Ken Thompson (B, C, Unix, UTF-8) Rob Pike (Unix, UTF-8) Robert Griesemer (Hotspot, JVM)
  3. 3. Google’ın Sorunu Ne? • Dev donanım ve yazılım altyapısı var. • Milyarlarca satır kod var. • Sunucular çoğunlukla C++, Java ve Python üzerinde koşuyor. • Binlerce mühendis aynı altyapıyı üzerinde çalışıyor. • Yüksek yüksek anlık trafik alıyor. • Ve tabi ki milyonlarca sunucu bilgisayar… – Google’ın 2006 raporuna göre 2.5 milyon sunucu…
  4. 4. Go’ya Hızlı Bakış • Go programlama dilinin official web sitesi golang.org’dur. • Go’yu bilgisayarıma nasıl indiririm? https://golang.org/dl/ • Go dökümantasyonuna erişim: https://golang.org/doc/ • Go paketlerine online erişim: https://golang.org/pkg/ • Online Go geliştirme ortamı: https://play.golang.org/
  5. 5. Neden Go? • Sade, kolay ve hızlı öğrenilebilir. • Sadece 25 anahtar kelimeye sahiptir. • Cross-platform bir dildir: Linux, Windows, MacOSX, Plan9 • Söz dizimi tartışmaları sevmez! Kendi kuralarıyla bu sorunu çözer… • Static Typed! • Pointer • Geriye dönük uyumluluk • Eşzamanlı(Concurrency) programlama için dil seviyesinde destek. • Go garbage collector mimarisine sahiptir. Hafızayı kendisi yönetir. • Sorun/Çözüm: Derleme işlemlerinin uzun sürmesi! • Sorun/Çözüm: Dillerde genellikle sadece belirli yeteneklerin kullanılması. Go’da bir işin genellikle tek bir yolu vardır. • Sorun/Çözüm: Kodu farklı sunuculara dağıtmak! Go tek bir dosyaya derlenir. Bu sayede tek bir binary dosyayı dağıtarak kolayca çalıştırılabilir. • Güçlü bir Standard Library’e sahip.
  6. 6. Go’da Ne Yok? • Exception Handling • Class • Inheritance • Generics • Method Overload
  7. 7. Biraz İstatistik
  8. 8. Go’nun Güçlü Olduğu Alanlar • Sistem • Veri Odaklı & Veri işleme – In-Memory, Veritabanı, XML, JSON, ZIP/RAR, Doküman vb… • Microservices, RESTful, API • Back-End • Real-time • Web • Oyun • IoT • Security
  9. 9. Go Programlama Dili Kullanıcıları • Google • Apple • Alibaba • Docker • Kubernetes • Twitter • Amazon • GitHub • Dropbox • Facebook • Tesla & SpaceX • Koding • YouTube • Ve diğer: https://github.com/golang/go/wiki/GoUsers
  10. 10. Go IDEs • Visual Studio Code : https://github.com/Microsoft/vscode-go • Vim : https://github.com/Fatih/vim-go • Emacs : https://github.com/dominikh/go-mode.el • SublimeText : https://github.com/DisposaBoy/GoSublime • IntelliJ : https://github.com/go-lang-plugin-org/go-lang-idea-plugin • Eclipse : https://github.com/GoClipse/goclipse • LiteIDE : https://github.com/visualfc/liteide • Atom : https://atom.io/packages/go-plus
  11. 11. Go Araçları • go tool : Go dilinin en temel aracıdır. Go uygulamanızın derleme esnasındaki işlemleri konsol üzerinden parametrik olarak yönetmenizi sağlar. • godoc : Kod içerisinde, örneğin bir metod üzerinde yazdığınız açıklama satırına göre bir belgelendirme-dökümantasyon üretmeyi sağlar. godoc.org sitesi üzerinden de Github ya da dilin gömülü özelliklerinin dökümanlarına online olarak ulaşmak mümkündür. Örn; http://godoc.org/fmt#Println • gofmt : Go dili söz dizimi kurallarını(bazıları katıdır) yöneten bir orkestra şefidir. Go kodu söz dizimi standartlarını uygular.
  12. 12. Standard Library • compress – compress/gzip • crypto • database – database/sql • encoding – encoding/csv, encoding/json, encoding/xml, encoding/binary • errors • html – html/template • net – net/http • os • reflect • runtime – runtime/cgo – runtime/pprof
  13. 13. Go Frameworks • Beego (Web) • Gin (Web) • Gorilla Toolkit (Web) • Revel (Web) • Goji (Web) • Buffalo (Web) • GORM (ORM) • XORM (ORM) • Gobot (Robotik ve IoT) • EMBD.KIDOMAN (Robotik ve IoT) • Makine Öğrenmesi www.cihanozhan.com/go-library-makine-ogrenmesi- kutuphaneleri
  14. 14. Go Frameworks (Microservices) • Go-Micro • Go-Kit • Gizmo • Kite Daha fazlası : http://awesome-go.com/
  15. 15. Go Frameworks (Testing) • testing Package(Standard Library) • Testify : Assertion and mock helper functions • gocheck : Power assertion helper functions. • gopwt : Power assertion helper functons. • go-testdeep : Deep comparison helper functions. • ginkgo ve gomega : A heavyweigth BDD testing framwork + assertion helpers. • goblin : A Mocha-like BDD testing framework. • GoConvey : BDD testing framework with web UI.
  16. 16. Go Frameworks (AI, ML, DL, Computer Vision) • Gorgonia (https://github.com/gorgonia/gorgonia) • GoCV (OpenCV için bir wrapper) (https://gocv.io/) Daha birçok : http://www.cihanozhan.com/golang-machine-learning-libraries/
  17. 17. Go Frameworks (Game) • Ebiten https://ebiten.org/ (2D Game Library) • G3N https://github.com/g3n/engine (3D Game Engine) • Engo https://engoengine.github.io/ (2D Game Engine) • Azul3D https://azul3d.org/ (3D Game Engine) Biraz da oyun geliştirme eğitimi : https://gameswithgo.org/
  18. 18. Keywords
  19. 19. Operatör ve Sınırlayıcılar
  20. 20. Types
  21. 21. Hello Mars!
  22. 22. Paketler Her Go uygulaması paketlerden oluşur. Paketler ne içerir? - Fonksiyon - Türler(types) - Değişkenler - Sabitler(constants) Bir paket bir dosya ve 10 satırdan oluşabileceği gibi, onlarca dosya ve binlerce satır koddan da oluşabilir. Başka paketleri kod dosyasına dahil etmek için import kullanılır.
  23. 23. Paketler Nasıl Kullanılır?
  24. 24. İsimlendirme • Büyük harf ile başlayan tanımlamaları kullanabiliyorsunuz(public). • Küçük harf ile başlayan tanımlamaları dışarıdan erişemezsiniz(private).
  25. 25. Değişkenler • Statically typed • Örtülü(implicit) ya da belirgin(explicit) ilklendirme(initialization) • Kısaltılmış değişken bildirimleri(sadece fonksiyonların içinde geçerli) • Adresini almak için(C’deki gibi)
  26. 26. Mini Uygulama (Değişkenler)
  27. 27. Hata Yönetimi (Errors) • Çoklu sonuç dönüyor, peki neden sonuçlardan biri hata türünde olmasın? • Exception yok. • Hataları her zaman yönetmeniz gerekiyor, kaçış yok! C’de Go’da
  28. 28. Tools
  29. 29. go tool (paket derleme) • Go kodunu inşa etmek ve kurmak için go aracı kullanmak gerekiyor. • Bir tane dosya(main paketli) çalıştırmak için. Derleyip çalıştırır: • Mevcut dizindeki paketi derlemek için: • Go aracı diğer tüm Go araçları için aynı zamanda bir proxy görevi yapıyor. Yani onun sayesinde diğer gerekli araçları çağırabilirsiniz – Örn: go tool proof
  30. 30. go tool (Import path) • Import path’leri URL şeklinde olabilir. • İndirmek için go aracını kullanabiliriz: • go get sırayla şunları sizin için yapar: – Git reposundan GOPATH/src/github/cihanozhan/libraryName olarak indirir. – Tüm paketi derler ve kurar. – Eğer –u parametresini verirseniz paketi günceller.
  31. 31. godoc • godoc kodun içinde yer alan belgelendirmeyi çekip çeşitli şekillerde sunar. • Yorum(comment) olarak ilgili tanımlamanın üst kısmına eklenirken: Kodun içinde yer alan belgelendirmenin bakımı daha kolay yapılmaktadır.
  32. 32. godoc Online olarak godoc.org’dan bakılabilir. http://godoc.org/fmt#Println http://godoc.org/github.com/cihanozhan/libraryName Çevrimdışı bir sunucu çalıştırılabilir. godoc –http:6060 Terminal üzerinden kullanılabilir. godoc fmt godoc github.com/koding/logging
  33. 33. gofmt • Go kodunu güzelleştirmek için kullanılır. • Tüm Go kaynak kodu fmt ile güzelleştirildi. gofmt’siz kod eklenmez. • Go kodunun syntax standardını belirler ve korur. • Kod okuma ve yazmayı kolaylaştırır.
  34. 34. Testing Go aracı ve testin paketi hafif bir test framework’ü sunar.
  35. 35. Testing (Çalıştırmak) Go aracı ile testleri çalıştırabiliriz. Mevcut tüm projeler için çalıştırmak için:
  36. 36. Türler (Go Temelleri) • Basit türler • Birleşik(composite) türler: • Soyut tür:
  37. 37. Türler (Go Temelleri)
  38. 38. Akış kontrolleri Basit akışlar • if, else • for, break, continue • switch, case, default, fallthrough • return • goto Gelişmiş akışlar • range • select • go • defer
  39. 39. defer
  40. 40. defer
  41. 41. defer defer deyimi, kendisini çevreleyen fonksiyon dönene kadar fonksiyonun çalışmasını erteler.
  42. 42. range • String • Slice • Map • Channel
  43. 43. slice?
  44. 44. Fonksiyonlar • Birinci sınıf fonksiyonlar • Fonksiyonlar da bir türdür • Anonim fonksiyonlar
  45. 45. Fonksiyonlar • Düz fonksiyonlar • Çoklu sonuçlar • Belirsiz sayıda parametre variadic arguments • Birinci sınıf fonksiyonlar
  46. 46. Fonksiyonlar
  47. 47. struct Birden fazla veri ve türü organize etmeye yarar. Veriye erişmek için nokta(.) operatörünü kullanıyoruz.
  48. 48. Metotlar • Metotlar da birer fonksiyondur. • Ancak fonksiyonlardan farklı olarak alıcılara sahiptirler. • Go’da class yapısı yoktur. Ama metotlar ile bir ana türe fonksiyonlar ile yetenek kazandırılabilir.
  49. 49. Metotlar Metotlar her türe tanımlanabilir.
  50. 50. Interface • Arayüzler bir türün davranışını belirlememizi sağlar. • Interface sıfır, bir ya da birden fazla metot ile tanımlanabilir. • Bir tür, interface ile tanımlanan metotları tanımlıyorsa(implement) o interface’i örtülü(implicit) gerçekleştirir.
  51. 51. Interface (Örnek) • Point ve MyInt türleri Add metodunu tanımlar: • Interface de bir tür olduğundan bir fonksiyona atanabilir:
  52. 52. Interface (Standard Library Examples) • Bir türü sıralayabilmek için: • fmt.Printf() çıktısını değiştirmek için(Python’daki str, repr gibi) • Herhangi bir türe HTTP serve desteği vermek için…
  53. 53. Interface (Stringer Örneği) • Point ve MyInt türlerine Stringer desteği verelim.
  54. 54. Interface (Çevreleme Örnek) • Standart çıktıya bir şey yazdırmak. • Belirgin(explicit) olarak da ifade edebiliriz. • Örnek kullanımlar:
  55. 55. Interface (Çevreleme Örnek) • Color paketi(https://github.com/fatih/color) sadece Linux/Mac OS X benzeri işletim sistemlerinde çalışıyordu(ANSI desteği olanlarda). • Renk çıktısını kontrol eden değişken (Output adında) bir Interface türü (io.Writer). Mevcut standart çıktısı kullanıyor. • Windows ANSI desteklemiyor. Çözüm:
  56. 56. Eşzamanlılık (Concurrency)
  57. 57. Eşzamanlılık Nedir? • Birbirinden bağımsız çalışmaların bir araya gelmesi, birleşmesidir. • Eşzamanlılık paralellik değildir. • Sadece bir işlemciniz varsa, uygulamanız hala eşzamanlı çalışabilir, ama paralel çalışamaz.
  58. 58. Bi’ tane eşzamanlı Go • Go’nun eşzamanlı özelliklerini basit bir uygulamalı görelim.
  59. 59. Bi’ tane daha • Zamanlamayı daha tahmin edilemez yapalım(hala bir saniyenin altında)
  60. 60. Bi’ Taneyi Çalıştırmak • Sonsuza kadar çalışan bir eşzamanlı uygulama…
  61. 61. Goroutine ile Çalıştırmak Biraz daha bekletip(Sleep) main fonksiyonu ve goroutine’in çalışmasını görelim.
  62. 62. Goroutine? • Program parçacıklarının(metotlar) go kelimesiyle bağımsız olarak çalıştırılmasını sağlar. • Maliyeti thread’e göre çook daha ucuzdur, binlerce hatta yüz binlerce çağrılabilir. • goroutine bir thread değildir(İşletim sistemi seviyesinde değil). • Bir tane thread altında binlerce goroutine çalışabilir. • go kelimesiyle çağrıldıktan sonra Go dili tarafından yönetilir.
  63. 63. Goroutine İletişimi
  64. 64. Kanallar Kanallar iki goroutine’nin arasında bir bağlantı sağlayarak iletişim yapmalarını sağlar. Kanal oluşturmak: Veri göndermek: Veri almak(ok işareti verinin yönünü gösterir)
  65. 65. Kanallar Öntanımlı olarak veri gönderirken ve alırken karşı taraf hazır olana kadar bloklanır.
  66. 66. Fibonacci ve Goroutine
  67. 67. Tamponlanmış Kanallar (Buffered Channels) • Tamponlanmış bir kanal aradaki senkronizasyon’u kaldırır. • Buffer’ın belli bir kapasitesi vardır. Kapasitesi dolan buffer’ı kullanmak için boşalması beklenir. 10 kapasiteli bir kanal:
  68. 68. Fibonacci (Buffered)
  69. 69. Select • select bir goroutine’in birden fazla iletişim işleminde beklemesine izin verir. • Veri alana ya da gönderilene kadar bloklar. • default case eklendiyse doğrudan oraya düşer(advanced pattern).
  70. 70. Select
  71. 71. Nasıl Go öğrenmeye başlayabilirim? • Türkçe turumuz(Ondokuz Mayıs Üniversitesi'nin katkılarıyla) – http://tur.golang.org.tr/ • Go dilinin tüm özellikleri güzel bir şekilde örneklerle anlatan bir site: – https://gobyexample.com/ • Orta ve ileri seviye örnekler, ipucuları – https://golang.org/doc/effective_go.html • Cihan Özhan, Go programlama dili eğitimleri(video, makale vb.) – http://www.cihanozhan.com/category/golang
  72. 72. Cemiyet-i Go • Türkçe mail list: https://groups.google.com/forum/#!forum/golang-tr • Ingilizce mail list: https://groups.google.com/forum/#!forum/golang-nuts • Freenode'de #go-nuts • Twitter'de #golang hash tagi kullanılıyor (#go değil!)
  73. 73. Kaynaklar • http://tur.golang.org.tr/ • https://gobyexample.com/ • http://talks.golang.org/2012/splash.article • http://go-talks.appspot.com/github.com/golang/talks/2012/simple.slide • https://github.com/golangmedellin/gotalks • https://talks.golang.org/2012/concurrency.slide • https://talks.golang.org/2014/taste.slide • http://go-talks.appspot.com/github.com/fatih/talks/go-giris/giris.slide • https://go-talks.appspot.com/github.com/cihanozhan/talks-golang/go-giris/giris.slide • http://www.cihanozhan.com/category/golang/ Sunumu hazırlarken yukarıdaki kaynaklardan faydalandım.

×