"Enter"a basıp içeriğe geçin

Go Syntax’ına Genel Bakış #1 – Hello World!

Merhabalar,

YASAL UYARI: Bu yazı programlama hakkında hiç tecrübesi olmayan kişilere hitap etmemektedir. Daha önce farklı bir dilde temel seviyede de olsa bir şeyler yazdığınızı varsayarak anlatıyor olacağım.

Bu sıralar biraz Go diline ilgi duyuyorum. Öğrenmeye başladım ve bu süreçte öğrendiğim belli başlı şeyleri bu blog altında yazacağım.

Öncelikle kaynaklarımdan başlayalım. Dil hakkında temel bilgi sahibi olmak için video kaynaklar yerine yazılı kaynakları tercih ettim. Uygulamalar yapmaya başladığım zaman video kaynakları da incelemeye başlayacağım. Şimdilik üzerinden ilerlediğim kaynak “A Tour Of Go“. Şu adres üzerinden inceleyebilirsiniz: https://tour.golang.org/

Go’nun kendi ürettiği bir araç. Burada bir süre takılarak temel bilgileri alabilirsiniz. Eğer İngilizce bilmiyorsanız sorun değil, giriş yazısından sonra bir sayfa ilerlerseniz dil seçme sayfasıyla karşılaşıyorsunuz. Burada Türkçe seçeneği de mevcut.

İnternet üzerindeki milyonlarca kaynakta olduğu gibi biz de merhaba dünya uygulaması ile başlayalım.

package main

import "fmt"

func main() {
  fmt.Println("Hello, World!")
}

Merhaba dünya uygulamamız bu kadar. Şimdi biraz bunun üzerinden gidebiliriz. Öncelikle package main şeklinde bir ifade kullandık. Paketlerin kullanım amacı temel anlamda kodumuzu ayrıştırmak diyebiliriz. Programlamada çok önemli bir prensip vardır: “DRY: Don’t Repeat Yourself (Kendini Tekrar Etme)”.

Kodların yeniden kullanılabilirliği çok önemlidir. Eğer bir yerde bir kodu iki kez yazmışsanız orada bir problem vardır. Yeniden kullanılabilirlik için kullanabileceğimiz en temel özellik fonksiyonlardır. Bu meseleyi biraz örneklendirelim.

Sürekli sayıların küplerini almanız gereken bir uygulama yaptığınızı varsayalım. Birçok yerde sayıların küplerini alıyorsunuz ve kullanıyorsunuz. Bu durumda şu şekilde bir kullanıma gitmeniz gerekiyor:

kup = sayi * sayi * sayi

Her seferinde bu şekilde bir ifade yazmanız gerekiyor. Bunun yerine bir fonksiyon yazabiliriz.

function kupAl(sayi) {
  return sayi * sayi * sayi
}

Bu şekilde bir fonksiyon oluşturduğumuzda programımızın herhangi bir yerinde yukarıdaki o çirkin görüntüyü yazmak yerine kupAl(sayi) şeklinde oldukça şirin olan yeni ifademizi kullanabiliriz.

Küp alma örneği oldukça basit bir örnekti aslında. Böyle bir şey için fonksiyon oluşturmanız veya tekrar tekrar aynı ifadeyi yazmanız arasında çok bir fark yoktur ama değinmek istediğim noktayı anladığınızı varsayıyorum. Burada küp alma fonksiyonu yerinde belki içerisinde 50 satır komut olan bir fonksiyon da olabilirdi. Bu durumda buna ihtiyaç duyduğunuz her yerde birden bire 50 satır birden kod eklenmiş olacaktı. Bir de ileride bu yaptığınız işlemi biraz değiştirmeniz gerektiyse vay halinize. Değiştir değiştirebilirsen.

Neyse, şimdi konumuza dönelim. Fonksiyonların, yeniden kullanılabilirlik açısından atabileceğimiz ilk adım olduğunu söylemiştik. Paketler de bir diğer adımımız. Programlarımızı yazarken paketler oluşturup içerisine aynı amaca hizmet eden fonksiyonları ekliyoruz (aynı amaca hizmetten kastımız şu: bir paketin içinde sadece matematiksel fonksiyonların olması vs.). Fonksiyonlarımızı ekledikten sonra paketimizi artık istediğimiz her yerde çağırabiliriz ve içerisindeki fonksiyonları kullanabiliriz.

Paketler hakkında daha detaylı bilgi sahibi olmak isterseniz şu adresteki dokümanı inceleyebilirsiniz: https://www.golang-book.com/books/intro/11

Şimdi isterseniz tekrar örnek kodumuza dönüp bir bakabilirsiniz. package main ifadesinden bahsettik. Şimdi sırada import “fmt” ifadesi var.

Import komutu çeşitli paketleri programımıza dahil etmemizi sağlıyor. Bu sayede bu paketlerin içerisindeki fonksiyonları kullanabiliyoruz. Örneğin içerisinde matematiksel fonksiyonlar olan bir paket yazdık ve adını matematik koyduk. İçerisinde de mesela sinusHesapla diye bir fonksiyon olsun. Bu fonksiyona erişmek istiyorsak her şeyden önce paketimizi import etmemiz gerekiyor. import “matematik” diyerek paketimizi import edebiliyoruz.

Import’un birkaç farklı yazım şekli var. İsterseniz bütün paketleri alt alta import “paket_adi” şeklinde yazabilirsiniz.

import "fmt"
import "math"

Ya da bütün paketlerinizi tek bir import altında toplayıp şu şekilde yazabilirsiniz:

import (
  "fmt"
  "math"
)

Burada dikkat etmeniz gereken şey hepsini ayrı bir satıra yazmak. Aksi takdirde problem yaşayacaksınız.

Bu arada son bir şey daha: Tahminimce fmt ifadesi “Formatted Input/Output” ifadesinin kısaltılmışı. (Kesin bilgi değil, yaymayalım)

Import ifadesinin yazımından da bahsettik. Şimdi kodlarımızı incelemeye devam edelim. Importtan sonra karşımıza func main ifadesi çıkıyor.

Go dilinde fonksiyon tanımlamak için func ifadesini kullanıyoruz. Burada main adına bir fonksiyon oluşturduk. Main özel bir isim, Go programlarımız çalıştırıldığı zaman sadece main fonksiyonunun içerisindeki kodu çalıştırır. Yani siz 100 tane fonksiyon da yazmış olsanız, bunları direkt olarak main içerisinde veya dolaylı yoldan main fonksiyonu içerisinde çağırmazsanız hiçbir şekilde çalışmayacaktır.

Main fonksiyonumuzun içerisine baktığımız zaman fmt.Println adında bir fonksiyon görüyoruz. Buradaki Println fonksiyonu konsola bir satır yazdırmaya yarıyor.

Burada dikkat edilmesi gereken mevzu ilk harfinin büyük olması. Go’da bir paketin içerisindeki bir fonksiyonun dışarıdan çağırılabilmesi için bu fonksiyonun baş harfinin büyük olması gerekiyor. Bunu öğrenirken basit, hiçbir iş yapmayan, içerisinde sadece iki tane fonksiyon olan bir paket yazdım.

package Kelime

import "fmt"

func Merhaba(word string) {
  fmt.Println("Merhaba! " + word)
}

func deneme() {
  fmt.Print("Hey!")
}

Paketimin içeriği tam olarak böyle. Ben başka bir dosya üzerinde Kelime paketini import ettikten sonra Kelime.Merhaba diyerek Merhaba fonksiyonumu çağırabiliyorum ama Kelime.deneme diyerek deneme fonksiyonumu çalıştıramıyorum.

Birçok dilde bu sorun public, private gibi anahtar kelimeleri fonksiyonların adlarının başına getirerek çözülmüş, Go burada biraz farklı bir yol izlemiş ve harflerin büyük/küçük olma durumlarına göre fonksiyona dışarıdan erişilip erişilemeyeceğini belirlemiş. Açıkçası ben fonksiyonların ilk harflerinin büyük olmasından çok rahatsız olan bir insanım ama bu yöntem hoşuma gitti.

Burada hello world incelememizin sonuna gelmiş bulunmaktayız. Bir sonraki yazıda değişkenlerin tanımlanmasına, fonksiyonların parametrelerinin tanımlanmasına ve fonksiyonların nasıl değer döndürdüklerine bakabiliriz. Return ile alakalı çok hoşuma giden birkaç mesele var. Bunlara değinmeyi düşünüyorum.

Bir sonraki yazıya kadar, kendinize iyi bakın. Görüşmek üzere…

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir