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
Cihan ÖzhanDeveloper, AI Engineer/Hacker, Data Master
7. 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)
8. 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…
9. 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/
10. 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.
11. Go’da Ne Yok?
• Exception Handling
• Class
• Inheritance
• Generics
• Method Overload
13. 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
14. 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
15. 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
16. 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.
17. 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
20. 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.
21. 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/
22. 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/
28. 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.
30. İ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).
31. 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)
33. 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
35. 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
36. 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.
37. 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.
38. 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
39. 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.
54. struct
Birden fazla veri ve türü organize etmeye yarar.
Veriye erişmek için nokta(.) operatörünü kullanıyoruz.
55. 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.
57. 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.
58. Interface
(Örnek)
• Point ve MyInt türleri Add metodunu tanımlar:
• Interface de bir tür olduğundan bir fonksiyona atanabilir:
59. 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…
62. 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:
64. 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.
65. Bi’ tane eşzamanlı Go
• Go’nun eşzamanlı özelliklerini basit bir uygulamalı görelim.
66. Bi’ tane daha
• Zamanlamayı daha tahmin edilemez yapalım(hala bir saniyenin altında)
69. 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.
71. 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)
74. 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:
76. 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).
78. 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
79. 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!)