Go öğreniyorum - Gün 2

`Introducing Go` kitabından bugün öğrendiklerim

Bugün değişkenleri, sabitleri, scope’u, isimlendirme düzenini öğrendim.

Chapter 3

Değişkenler

Değişken denen şey aslında, adı ve tipi bir depolama yeri. Go’da değişken tanımlarken;

var DEĞİŞKEN_ADI DEĞİŞKEN_TİPİ = DEĞERİ

formülü ile oluyor. Örneğin;

var x string = "Hello World"

Keza;

var x string
x = "Hello World"

şeklinde de olabiliyor. Aslında tanımla aynı cebir / matematikteki gibi fakat

var x int = 5

tanımlamasını okurken; X eşittler 5 yerine;

x, integer olarak 5 değerini aldı

ya da

x’e, integer olarak 5 atandı

olmalı çünkü değişkenler, adı üstünde değişken yani değeri değişebiliyor. Bu bakımdan eşitlik kesin olmuyor.

package main

import "fmt"

func main() {
  var x string
  x = "birinci "
  fmt.Println(x)
  x = x + "ikinci"
  fmt.Println(x)
}
// çıktı
// birinci
// birinci ikinci

Sonuç olarak komutlardan oluşan bir liste ve yukarıdan aşağı doğru çalışıyor. x = x + "ikinci" ifadesini;

x’in o anki değeri ile string “ikinci"’yi x’e toplama değeri olarak ata!

Pek çok programlama dilinde de gördüğüm, x = x + y formu için, Go’da da; x += y formu mevcut.

Eşitlik için == kullanılıyor.

package main

import "fmt"

func main() {
  var x string = "merhaba"
  var y string = "dünya"
  fmt.Println(x == y)
}

// false

Değişken tanımlamak için kısa bir yol var!

x := "Merhaba Dünya!"

Go derleyicisi := görünce anlıyor atanacak değişkenin tipini. Bu konuya Type Inference deniyor. Hatta şunlar da uygun;

var x = "Merhaba"
y := 11

Idiomatic Go (Deyimlerle Dolu Go)

Kitap bana uyarıda bulunuyor. Belli bir seviyeye gelince daha kıvrak şekilde Go yazmamı öneriyor. Başlangıç seviyesinde daha formal, daha kurallarına uygun ilerle diyor bana… Belli seviyedeki Go programcıları, bu tarz kısa yolları, ya da daha işin püf noktalarını bildikleri için, yeni yazanların bu tür şeyleri bilememelerinin normal olduğunu söylüyor.

Değişkene nasıl isim vermeli ?

  • Mutlaka harf ile başlamalı,
  • Harf, sayı, alt çizgi (underscore - _) olabilir,
  • Anlaşılır olsa iyi olur :) Go derleyici için bir sıkıntı yok ama başka biri baktığında anlamalı…
  • camelCase, BumpyCaps, mixedCase diye adlandırılan değişken yazım stilleri de kullanılabilir.

Scope (Kapsam)

Go, bloklar içinde lexically scope kullanır. Yani, en yakındaki süslü parantez, blok ya da iç içe geçmiş süslü parantezlere en yakın değişken o alan kapsamı içindedir.

func main() {
  var x string = "Merhaba"
  fmt.Println(x)
}

func f() {
  fmt.Println(x)  // burası sıkıntılı
}

Yukarıdaki kod derlenemez! f() fonksiyonundaki x : undefined yani tanımlanmamıştır! Doğrusu;

package main

import "fmt"

var x string = "Merhaba"

func main() {
  fmt.Println("Bu main()’den: ", x)
  f() // çaktırmadan fonksiyon call ettim!
}

func f() {
  fmt.Println("Bu f()’den:", x)
}

Constant (Sabit)

Pek çok dilde olduğu gibi, sabit kavramı Go’da da var. Değeri daha sonra değiştirilemeyen şeydir Constant. Bu bakımdan da sabit denmiştir :) Aynı değişken tanımlar gibi var kelimesi ve ek olarak constant kelimisini kullanıyoruz:

package main

import "fmt"

func main() {
  const x string = "Merhaba"  // constant
  fmt.Println(x)
}

Örneğin matematikteki Pi sayısı da bir constant’tır.

package main

import "fmt"
import "math" // matematik kütüphanesi

func main() {
  fmt.Println(math.Pi) // 3.141592653589793
}

Tip: godoc math

Çoklu Değişken/Sabit Tanımlama (Multiple Variables/Constants)

var (
  a = 5
  b = 10
  c = 15
)

const (
  x = "Merhaba"
  y = "Dünya"
  z = "Selam"
)

Çarpma Yapan Program Yazalım

Kullanıcıdan gelen sayıyı 2 ile çarpıp ekrana sonucu yazalım:

mkdir -p ~/golang-book/chapter3
cd ~/golang-book/chapter3/
touch example_multiply_user_input_by_2.go

ve;

package main

import "fmt"

func main() {
  fmt.Println("Sayı girin: ")
  var input float64
  fmt.Scanf("%f", &input)  // Scanf ve &input yeni birşey...
  output := input * 2
  fmt.Println("Sonuç: ", output)
}
go run example_multiply_user_input_by_2.go

Ödev

  1. Fahrenheit’ı Derece’ye çeviren programı yaz. C = (F - 32) * 5/9
  2. Feet’i Metre’ye çeviren programı yaz. 1 ft = 0.3048 m