Burada sadece view kısmını anlatacağım ama diğer dosyalar içinde işler aynı sayılır.
Öncelikle herhangi bir yerde bir adet go dosyası oluşturuyoruz ve run, build komutlarını deneyerek derleme tarafında problem olmadığını kontrol ediyoruz. Daha sonrasında oluşturduğumuz go dosyasının ana bölümlerini oluşturuyoruz.
Ben main.go isimli bir dosya oluşturdum;
package main
import ()
func main() {
//
}Öncelikle import'a aşağıda ki package'leri ekleyelim.net/http -> Go'da ki http request response işlemleri için ekleniyor.
log -> Diğer dillerden aşina olabileceğiniz bir şeydir. İçinde çalıştırdığınız olayın hata vermesi durumunda ayrıntılı bir döküm almamızı sağlıyor.
strings -> Biraz sonra string ifadeler ile yapacağımız join vb. işlemler için gerekli.
Şimdi ise / dan sonrasını yakalayalım ve seçtiğimiz portu dinlemeye başlayalım.
package main
import (
"log"
"net/http"
"strings"
)
func main() {
http.HandleFunc("/", resolver)
log.Fatal(http.ListenAndServe(":8080", nil))
}Yukarıda ki kod bloğunu çalıştırırsanız HandleFunc'ın 2. parametresi yüzünden hata ile karşılaşacaksınız. Burada ki ikinci parametrenin görevi kısaca /'dan sonra gelen her şeyi yakalamaktır. Devam edelim daha iyi anlayacaksınız.2. parametreyi çift tırnak içinde yazmadığımız için derleyici bizden bunu fonksiyon olarak bekliyor. Fonksiyonumuzu oluşturalım ve fonksiyonumuza import kısmında eklediğimiz package'lerden net/http'nin altında bulunan ResponseWriter ve Request fonksiyonlarını verelim. Bunlar isminden de anlaşılabileceği gibi response'ı sayfaya basmamıza ve request içinde elimize gelen her şeyi okumamıza olanak sağlıyor.
package main
import (
"log"
"net/http"
"strings"
)
func main() {
http.HandleFunc("/", resolver)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func resolver(w http.ResponseWriter, r *http.Request) {
}w http.ResponseWriter şeklindeki ifadelerin başındaki string değişken ikincisi ise parametre olarak geçiyor. Yani http.ResponseWriter parametresini w değişkenine atamış oluyoruz. Bunları yazdıktan sonra /url şeklindeki ifadeyi bulmamız gerekiyor ki amacımızı yerine getirebilelim.package main
import (
"log"
"net/http"
"strings"
)
func main() {
http.HandleFunc("/", resolver)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func resolver(w http.ResponseWriter, r *http.Request) {
url := r.URL.Path
}url isminde bir değişken oluşturduk ve değer olarak da request'ten gelen verilerin arasından url'i ve onun altında ki path'i yani /url kısmını atadık.Bundan sonraki kısımda birçok seçeneğimiz var lakin ben switch kullanarak işlemi devam ettirdim. Şimdi url değişkenimizi switch'e verelim ve case içinde kontrol ettirelim.
package main
import (
"log"
"net/http"
"strings"
)
func main() {
http.HandleFunc("/", resolver)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func resolver(w http.ResponseWriter, r *http.Request) {
url := r.URL.Path
switch url {
case "/":
http.ServeFile(w, r, view("index"))
default:
http.ServeFile(w, r, view("404"))
}
}Case'e koşul olarak /name şeklinde neyi yazarsanız yazın hepsi çalışacaktır. Tabii bunlar yoksa default kısmı da 404 döndürmeli ki yaptığımız şeyin bir anlamı olsun
. Go'da bir dosyayı çalıştırabilmek için http.ServeFile'ı kullanıyoruz. Sırasıyla aldığı 1. parametre response'ın yazdırılmasını, ikincisi o anki request'i, üçüncüsü ise dahil etmek istediğimiz dosyanın yoludur. Lakin ben burada uzun uzun yazmak yerine view isminde bir fonksiyon oluşturdum ve içinde yazdığım değerin sayfa yolu olarak dönmesini istedim.package main
import (
"log"
"net/http"
"strings"
)
func main() {
http.HandleFunc("/", resolver)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func view(name string) string {
path := strings.Join([]string{"./views/", name, ".html"}, "")
return path
}
func resolver(w http.ResponseWriter, r *http.Request) {
url := r.URL.Path
switch url {
case "/":
http.ServeFile(w, r, view("index"))
default:
http.ServeFile(w, r, view("404"))
}
}Öncelikle ServeFile içinden fonksiyonumuza değeri gönderdim. Fonksiyonun içerisinde gelen değerin ismi ve türü yazıyor. Yani bir değer gelecek ve bu string olacak şekilde. Parantezlerin dışındaki string ise dönecek verinin tipini işaret ediyor. Bunu koymadığınız zaman fonksiyondan herhangi bir veri döndüremiyorsunuz.strings package'ini strings.Join ifadesini kullanabilmek için import etmiştik. strings.Join; strings.Join([]string{değer1, değer2, değer,3,...}, "birleştirme operatörü") şeklinde kullanılıyor. []string{} kısmı da bir dizi vereceğimizi ve bu dizinin string olacağını ifade ediyor. Daha sonrasında path değişkenimizi geri döndürüyoruz.
Şimdi işin sonuna baktığımıza switch case içerisinde hangi dosya ismini tanımladıysak sayfaya onu dahil etmiş olacak. İyi çalışmalar dilerim