Golang nedir? Golang ile REST API Geliştirme
Published: 2020-10-12 09:44:59

## Başlıklar
  * [Golang Nedir?](#chapter-1)
  * [Golang Kurulum](#chapter-2)
  * [Golang ile REST API Geliştirme](#chapter-3)


### **Golang Nedir?** <a name="chapter-1"></a>
Go programlama dili, Google tarafından geliştirilmiş “büyük projelerdeki yazılım tecrübeleri” ile belirlenmiş bir dildir. Her programlama dilinin kendine ait bir çalışma alanında avantajları vardır. Go dilinin geliştirilmesi, Google’ın az dil özelliği kuralıyla esnek, hızlı, performanslı ve güçlü bir dil oluşturmaktır. Kısacası asıl amaç hızlı bir şekilde işlem yapmak, bu işlemleri yaparken de performanstan feragat etmemektir.

Go tamamen açık kaynak kodlarına sahip bir programlama dilidir. Bu yüzden Go dilini kullanan diğer şirketlerin geliştiricileri tavsiyesinde de Go diline eklemeler ve çıkarmalar yapılmaktadır. Fakat asıl amaç hızlı ve efektif bir şekilde geliştirme yapmak olduğu için, çoğu dilde olan Generics gibi bazı özelliklerin olmadığını gözlemleyebiliriz. Go dilinde neden Generics olmadığı sorulduğunda bu dili geliştiren Google geliştiricilerinin, “Generics performanslı ve hızlı değil, henüz bunun için bir çözüm bulamadık. Bulursak ekleriz.” Dediği öğrenildi. Bu da dilde performans ve hıza ne kadar önem verdiklerinin kısa bir özeti diyebiliriz.

Network ve Web Aplikasyonları geliştirmede büyük önem taşımaktadır. Oldukça verimli ve compile etmesi çok hızlı bir dil olduğu için geliştiriciler Go dilini sistem yönetiminde sıklıkla kullanmaktadır.
### **Golang Kurulum** <a name="chapter-2"></a>

Go dilini nasıl kuracağınızı bilmiyorsanız, aşağıdaki linkten işletim sisteminize göre uygun yükleme seçeneklerine ulaşabilirsiniz:
Golang kurulum: https://golang.org/doc/install 

### **Go ile REST API Geliştirme** <a name="chapter-3"></a>

Şimdi localhost’umuzda HTTP requestleri ile çalışan basit bir API geliştirelim. İlk olarak main.go isimli dosyamızı oluşturalım. Bu dosya içerisine aşağıdaki kodu yapıştıralım. Bu kodumuzda görmüş olduğunuz gibi 3 farklı fonksiyon bulunmaktadır. Bunlardan **homePage** fonksiyonu root’taki URL requestlerinden sorumludur, **handleRequests** fonksiyonu ise URL ile tanımlanan fonksiyonu eşleştirir. 

```go
package main

import (
    "fmt"
    "log"
    "net/http"
)

func homePage(w http.ResponseWriter, r *http.Request){
    fmt.Fprintf(w, "Welcome to the HomePage!")
    fmt.Println("Endpoint Hit: homePage")
}

func handleRequests() {
    http.HandleFunc("/", homePage)
    log.Fatal(http.ListenAndServe(":10000", nil))
}

func main() {
    handleRequests()
}
```
Yeni bir eklenti geliştirmek istedik bundan sonra ne yapacağız? Yukarıda anlattığım gibi, bir veriyi göndermek istiyorsanız yapacağınız işlemleri bir fonksiyon içerisinde tamamlayıp, handleRequest fonksiyonunda **http.HandleFunc("/", xxx)** şeklinde URL uzantısını ekleyip veriyi gönderebiliriz. 

### **Dinamik Veri Aktarımı**

Golang ile Web API geliştirmeyi öğrendiğimize göre şimdi de dinamik bir şekilde veri nasıl aktarılır onu inceleyebiliriz. Dinamik veri aktarımı ile ilgili iki farklı yaklaşım bulunmaktadır. Birincisi çoğu yerde bulabileceğiniz fonksiyon içerisinde bir structure açıp, veriyi içerisinde saklamanız. İkinci yöntem ise structure gerektirmeyen verileri kolayca işlememize yarayan Gabs. Gabs, dinamik ya da bilinmeyen JSON yapıları ile uğraşırken büyük yarar sağlamaktadır. 

Gabs'in yüklenmesi
```bash
go get github.com/Jeffail/gabs
```

Yükledikten sonra import edip, kullanmaya başlayabiliriz.

```go
package main

import (
	"fmt"

	"github.com/Jeffail/gabs"
)

func main() {
	data := []byte(`{
		"employees":{
		   "protected":false,
		   "address":{
			  "street":"22 Saint-Lazare",
			  "postalCode":"75003",
			  "city":"Paris",
			  "countryCode":"FRA",
			  "country":"France"
		   },
		   "employee":[
			  {
				 "id":1,
				 "first_name":"Jeanette",
				 "last_name":"Penddreth"
			  },
			  {
				 "id":2,
				 "firstName":"Giavani",
				 "lastName":"Frediani"
			  }
		   ]
		}
	 }`)

	jsonParsed, err := gabs.ParseJSON(data)
	if err != nil {
		panic(err)
	}

	//JSON Aramasi 
	fmt.Println("Get value of Protected:\t", jsonParsed.Path("employees.protected").Data())
	fmt.Println("Get value of Country:\t", jsonParsed.Search("employees", "address", "country").Data())
	fmt.Println("ID of first employee:\t", jsonParsed.Path("employees.employee.0.id").String())
	fmt.Println("Check Country Exists:\t", jsonParsed.Exists("employees", "address", "countryCode"))

	// adres objelerinin yinelenmesi
	for key, child := range jsonParsed.Search("employees", "address").ChildrenMap() {
		fmt.Printf("Key=>%v, Value=>%v\n", key, child.Data().(string))
	}

	// employee arrayinin yinelenmesi 
	for _, child := range jsonParsed.Search("employees", "employee").Children() {
		fmt.Println(child.Data())
	}

	// aramada indexin kullanilmasi 
	for _, child := range jsonParsed.Search("employees", "employee", "0").Children() {
		fmt.Println(child.Data())
	}
}
```
Yukarıdaki kodumuzda görmüş olduğunuz gibi data adında bir array açtık ve verimizi bu array içerisinde tutuyoruz. Fakat bu verimiz JSON encoding biçiminde tutulduğu için arraydeki değerlerimizi parselamamız gerekmektedir.

Verimizi bir database'den çekmiyoruz, statik olarak fonksiyon içerisinde tanımladık fakat dinamik bir şekilde verimizi çağırıyoruz. Eğer bir database ya da kullanıcı input'u ile veri çağırmamız gerekseydi de işlemlerimiz hemen hemen aynı olacaktı. 

Yukardaki işlemleri gerçekleştirdikten sonra çalıştırdığımızda bu şekilde bir output'a ulaşabiliriz:
```
Get value of Protected:  false
Get value of Country:    France
ID of first employee:    1
Check Country Exists:    true
Key=>street, Value=>22 Saint-Lazare
Key=>postalCode, Value=>75003
Key=>city, Value=>Paris
Key=>countryCode, Value=>FRA
Key=>country, Value=>France
map[id:1 first_name:Jeanette last_name:Penddreth]
map[id:2 firstName:Giavani lastName:Frediani]
Jeanette
Penddreth
1
```

Böylece data arrayinde tanımladığımız verileri işleyip (JSON Parsing), key:value kombinasyonu ile kolaylıkla ulaşabildik.