hello.go
adında yeni bir dosya oluşturun ve oluşturduğunuz dosyanın içine aşağıdaki kodu yazın.go run hello.go
yazın.main
fonksiyonu olan bir main
paketine sahip olacaksınız. Paketler, ilgili Go kodunu birlikte gruplandırmanın yoludur.func
anahtar kelimesi, adı ve gövdesi olan bir fonksiyon tanımlamınızı sağlar.import "fmt"
ile ekrana yazdırma fonksiyonu olan Println
'ı içeren bir paketi içe aktarıyoruz.fmt.Println
bizim yazmadığımız bir fonksiyon ve dış dünyadan gelen bir kod, "Hello World" stringini göndermek ise domain(bizim yazdığımız) kod.func
ile başlayan yeni bir fonksiyon oluşturduk ama bu sefer tanımlarken string
keywordunu de kullandık. Yaptığımız tanım ile bu yeni fonksiyonun string
bir değer döneceğini belirttik.hello_test.go
adında bir dosya oluşturalım ve bu dosya ile hello.go
dosyasının içindeki func Hello()
fonksiyonunu test edelim.go test
komutunu çalıştırın. Eğer testler geçerse, büyük ihtimalle Go'nun eski bir sürümünü kullanıyorsun. 1.16 veya üstü bir versiyon kullanıyorsanız testler çalışmayacaktır ve terminalde şöyle bir hata göreceksinizgo mod init hello
komutunu çalıştırın ve bu komut go.mod
dosyasını şu içeriklerle oluşturacaktırgo
tarafından kullanılan araçlara(örn: cli) kodunuzla alakalı temel bilgileri verir. Yazdığınız kodu veya uygulamayı dağıtmayı düşünüyorsanız kodun indirilebileceği yerleri ve bağımlılıklarını burada bildirirsiniz. Şimdilik module dosyanız minimum düzeyde ve bu şekilde olması normal. Moduller hakkında daha fazla bilgi edinmek için bu referansa bakabilirsin. Şimdi test etmeye ve Go öğrenmeye dönebiliriz.go test
veya go build
gibi go cli komutlarını çalıştırmadan önce her yeni projeniz için go mod init SOMENAME
komutunu çalıştırmanız gerekecek.go test
komutunu tekrardan çalıştırın. Testleri geçmiş olmalı. want
string'inin içerisindeki değeri değiştirerek kasıtlı olarak testlerin başarısız olmasını sağlayabilirsiniz.xxx_test.go
gibi adlandırılmış bir .go dosyasının içinde bulunmalıdırTest
keywordu ile başlamalıdırt *testing.T
'dır.*testing.T
tipini kullanabilmek için, "testing" paketini eklemelisin import "testing"
*testing.T
tipindeki t
argümanınızın test çerçevesine bir "hook" olduğunu bilmeniz yeterli. Testi başarısız kılmak için, t.Fail()
gibi metotları kullanabilirsin.if
varName := value
sözdizimi ile tekrar kullanabildiğimiz ve okunabilirliği arttırmak için bazı variablelar tanımladık.t.Errorf
t
üzerinde Errorf
method çağırıyoruz, bu metot mesaj yazdıracak ve testi başarsız kılacak. 'f', '%q' gibi yer tutucular ile yer tutucuların yerine gelecek yeni bir string oluşturmamıza izin veren biçimi ifade eder. Testin başarısız olmasını sağladınız da hangi sebeplerden dolayı başarısız olduğunu açıkca belirtmeniz gerekir.q
, testler için oldukça kullanışlı bir yer tutucudur.Errorf
gibi metotlar ve bizim yazdıklarımız gibi fonksiyonlar arasındaki farka ileride değineceğiz.godoc -http :8000
komutunu çalıştararak dökümanlara yerelde göz atabilirsiniz. localhost:8000/pkg adresine gittiğinizde, sisteminizde yüklü bütün paketleri göreceksiniz.godoc
komutuna ulaşamıyorsanız, go get golang.org/x/tools/cmd/godoc
yazarak edinebilirsiniz.go test
komutunu çalıştırınca, bir derleme hatası almalısınızHello
fonksiyonunu değiştirmeliyiz ve bir argüman almasını sağlamalıyız.Hello
fonksiyonunu, string türünde bir argümanı kabul edecek şekilde düzenleyin.hello.go
dosyası compile olmayacak. Bunu, main
fonksiyonununda olan Hello
fonksiyonunun kullanımını güncelleyerek çözebilirsin.Hello
fonksiyonun aldığı name
argümanını Hello,
ile birleştirerek kullanalım ve testi geçelim.commit
ederdim.commit
atabiliriz."Hello, "
'un oluşturulmasından kurtaracağı için uygulamanızın performansını arttırır.t *testing.T
'i parametre olarak pass etmeliyiz.testing.TB
, testing.T
veya testing.B
tipindeki interfaceleri kabul etmesi için oluşturulmuş başka bir interfacedir. Böylelikle benchmark veya test fonksiyonlarını testing.TB
ile çağırabiliriz.t.Helper()
, test kodlarına bu yöntemin bir yardımcı olduğunu söylemek için gereklidir. Bunu yaparak, testler başarısız olduğunda hangi satır ile testin başarısız olduğu bildirilirken, yardımcı fonksiyonun içindeki satırlar değil, fonksiyon çağrımızı yaptığımız satırlarda hata olduğu bildirilecektir. Bu sayede, geliştiriciler hangi testin başarısız olduğunu kolayca takip edebilecektir. Eğer tam olarak anlamadıysanız, herhangi bir testi başarısız olacak şekile getirin(şuan zaten öyle) ve test çıktısını gözlemleyin ve sonrasında aynı hatalı test kodunu t.Helper()
kodunun başına //
ekleyerek gözlemleyin.Hello()
fonksiyonunu tekrardan refactor ederek, istediğimize ulaşabiliriz.commit
edebiliriz.Hello()
fonksiyonu şuanda tek bir parametre alıyor fakat biz iki parametre gönderdik.Hello()
fonksiyonuna bir string parametre daha almasını sağlayarak çözebiliriz.if
kullanıp, o dile göre selamlama yapabiliriz."French"
yollandığı zaman, "Bonjour, "
ile selamlanacağını iddia ettiğiniz bir test yazınswitch
if
ifadesi kullanmak yerine, switch
kullanın. Daha sonra farklı dillerde de destek vermek istersek okumayı kolaylaştırması ve genişletilebilir olması için switch
kullanmak çok daha iyi olur.Hello()
fonksiyonunun çok kalabalıklaştığını, okumanın zorlaştığını iddia edebilirsiniz ve haklısınız. Ortak olan kısımları alarak yeni bir fonksiyon haline getirerek ona güzel bir isimlendirme yapabilirsiniz.prefix
adında bir değişken oluşturacak.string
tipinde bir dönüş için ""
değeri dönecek. Integer bir dönüş olsaydı bu 0
olacaktı.return
'da kullanabilirsiniz isterseniz return prefix
'de tercih edebilirsiniz.default
seçilecektir.private
(sadece o paket altında kullanılabilir, dışarıya kapalı) programlama bileşenleri küçük harf ile, public
(dışarıya açık) bileşenlerse büyük harf ile başlar. Algoritmalarımızın içindeki bileşenlerin hepsini dışarıya açmak istemediğimiz zaman private
tanım yapmalıyız.Hello, world
programı yazarken bu kadar çok şey öğrenebileceğini kim bilebilirdi?if
, const
ve switch
Hello()
'dan başlayarak, Hello("name")
sonrasındaysa Hello("name", "French")
e kadar ilerledik.