Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer

5 Kullanışlı Go Fonksiyonu

2 min read

Yazılım geliştiriciler bir süre sonra sürekli aynı işlemi gerçekleştiren fonksiyonlara ihtiyaç duyarlar. Kimisi geleceği düşünüp bunları her an elinin altında bulundurur ve hatta yeniden kullanılabilir birer paket haline getirir, kimisi ise yazıp geçer ve arkasına bir daha bakmaz :) Ben ise ilk örnekteki yazılımcı gibi Go projelerinde genellikle ihtiyaç duyduğum 10 fonksiyonu toparlayıp sizinle paylaşmak istedim. Sizin de olmazsa olmazlarınız varsa yorum olarak paylaşabilirseniz çok sevinirim ;)

1. ByteToString – Byte Değişkeni Stringe Dönüştürme

Hemen her projede ihtiyacım olan bir konudur byte değişkeni string’e dönüştürme. Aslında byte’tan string’e ve string’den byte’a dönüştürmek için Go’nun aşağıdaki örnekte olduğu gibi kendi fonksiyonlarını kullanabilirsiniz (Teşekkürler Fatih Arslan) ancak biz çalışmalarımız esnasında bu dönüştürmelerin sağlıklı çalışmadığını ve karakterleri bozabildiğini tecrübe ettik. Bunun üzerine yazının devamında belirteceğim söz konusu fonksiyonlardan faydalandık.

package main

import (
	"fmt"
)

func main() {
	a := "foo"
	b := []byte("bar")
	fmt.Println([]byte(a))
	fmt.Println(string(b))
}

Bizim tercih ettiğimiz yöntem için iki farklı fonksiyon önerim var. Tercih size kalmış.

func BytesToStrings(b []byte) string {
	return fmt.Sprintf("%s", b)
}

veya

func BytesToString(b []byte) string {
	return string(b[:])
}

2. fmt.Println’dan Kurtulmak

Go’da özellikle geliştirme (dev) ortamında yapılan işlemin sonucunu ekrana yazdırmak için fmt.Println() kullanmaktayız. Ancak bununla birlikte Go’nun bir özelliği de değişkenlere değer olarak fonksiyon atayabilmemiz. Bu iki bilgiyi birleştirince ekrana bir şey yazdırmak için şöyle pratik bir çözüm üretebiliriz.

package main

import "fmt"

func main() {

	p := fmt.Println

	p("yakuter.com")

}

3. IsEmpty – Bir Klasörün Boş Olup Olmadığını Kontrol Etme

Bazı durumlarda Go ile bir klasörün boş olup olmadığını kontrol etme gereği duyarız. Bunun için de hazır bir fonksiyonumuz olmadığı için aşağıdaki gibi bir fonksiyon ile ihtiyacımızı karşılayabiliriz. Bu fonksiyon, klasörün içinde dosya varsa true, yoksa false döner. Eğer belirtilen isimde bir klasör yoksa ‘no such file or directory’ hata mesajı döner.

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	fmt.Println(IsEmpty("/xxx/yyy/zzz"))
}

func IsEmpty(name string) (bool, error) {
	f, err := os.Open(name)
	if err != nil {
		return false, err
	}
	defer f.Close()

	_, err = f.Readdir(1)
	if err == io.EOF {
		return true, nil
	}
	return false, err
}

Hazır dosyalardan konu açılmışken daha önce Go Programlama Dili (Golang) ile Dosya İşlemleri başlıklı yazımı okumanızı ve örneklere bakmanızı tavsiye ederim.

4. Go ile Bir Klasörün İçindeki Tüm Dosyaları Silme

Bir üst maddedeki gibi bir klasörün içindekilerin varlığını kontrol etme ve bu klasördeki her şeyi silme aslında basit gibi dursa da biraz insanı uğraştıran konular. Ben de tekrar tekrar uğraşmamak için bir klasörün içini boşaltırken (tüm dosya ve klasörleri silmek için) aşağıdaki fonksiyondan faydalanıyorum.

package main

import (
	"os"
	"path/filepath"
)

func main() {
	err := RemoveContents("/aaa/bbb/ccc")
	if err != nil {
		panic(err)
	}
}

func RemoveContents(dir string) error {
	d, err := os.Open(dir)
	if err != nil {
		return err
	}
	defer d.Close()
	names, err := d.Readdirnames(-1)
	if err != nil {
		return err
	}
	for _, name := range names {
		err = os.RemoveAll(filepath.Join(dir, name))
		if err != nil {
			return err
		}
	}
	return nil
}

5. Go ile Metinleri Snake Case (snake_case) Yapma

Bazen bir metni küçültüp aralarına alt çizgi eklemek isteriz. İngilizce’de bunun karşılığı Snake Case şeklindedir. Go ile bunu başarmak için aşağıdaki fonksiyondan faydalanabilirsiniz.

package main

import (
	"fmt"
	"regexp"
	"strings"
)

func main() {
	fmt.Println(ToSnakeCase("AnkaraBursaAmasya"))
	// Çıktı: ankara_bursa_amasya
}

func ToSnakeCase(str string) string {
	var matchFirstCap = regexp.MustCompile("(.)([A-Z][a-z]+)")
	var matchAllCap = regexp.MustCompile("([a-z0-9])([A-Z])")

	snake := matchFirstCap.ReplaceAllString(str, "${1}_${2}")
	snake = matchAllCap.ReplaceAllString(snake, "${1}_${2}")
	return strings.ToLower(snake)
}

Son Sözler

Şu sıralar Go ile fazla haşir neşir olduğum için yazıların içeriği de o tarafa kaymış durumda. Umarım ülkemizde nispeten yeni yeni yaygınlaşmakta olan bu programlama dilini öğrenmek isteyenlere biraz olsun faydası dokunur. Sevgiler, saygılar.

Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer