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
Go Nedir?
• Açıkkaynak 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
Go’nun Güçlü OlduğuAlanlar
• 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 DiliKullanı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
Go Araçları
• gotool : 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
Go Frameworks
(Testing)
• testingPackage(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)
• Ebitenhttps://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/
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.
İsimlendirme
• Büyük harfile 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)
Hata Yönetimi
(Errors)
• Çoklusonuç 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
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 koduniç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’danbakı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 kodunugü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.
struct
Birden fazla verive türü organize etmeye yarar.
Veriye erişmek için nokta(.) operatörünü kullanıyoruz.
55.
Metotlar
• Metotlar dabirer 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.
Interface
• Arayüzler birtü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 veMyInt 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…
Interface
(Çevreleme Örnek)
• Colorpaketi(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:
Eşzamanlılık Nedir?
• Birbirindenbağı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)
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.
Kanallar
Kanallar iki goroutine’ninarası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)
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:
Select
• select birgoroutine’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).
Nasıl Go öğrenmeyebaş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