İçeriğe geç
Educora
Başlangıç14 dk2 / 10

Değişkenler, türler ve sabitler

`var` ve `:=` ile değişken tanımla; temel türleri, sıfır değerleri, tür dönüşümlerini, dizeleri ve `iota` ile sabitleri öğren.

Kendini test et
Bu derste öğreneceklerin
  • Değişkenleri var ve := ile tanımlamak ve farkı açıklamak
  • Temel türleri ve sıfır değerlerini tanımak
  • Türleri açıkça dönüştürmek ve strconv ile dize–sayı dönüşümleri yapmak
  • const ve iota ile sabitler oluşturmak

Bir oyun yazdığını düşün. Oyuncunun adını, puanını, seviyesini ve çevrim içi olup olmadığını nerede tutarsın? Değişkenlerde. Go'da her değişkenin kesin bir türü vardır ve derleyici ona uymayan bir değeri yazmana izin vermez. Bu derste değişken ve sabit tanımlamayı, temel türleri ve bunlar arasındaki dönüşümleri öğreneceksin.

Değişken tanımlama

Go'da bir değişken iki şekilde tanımlanabilir. Uzun biçim var anahtar kelimesini kullanır: var age int = 14. Değer verildiyse tür yazılmayabilir; Go onu kendisi belirler. Fonksiyonların içinde ise en çok kısa tanımlama kullanılır: city := "Baku". := yeni bir değişken oluşturur, sıradan = ise var olan bir değişkene yeni değer atar.

Go
package main

import "fmt"

func main() {
	var name string = "Leyla"
	var age = 14
	city := "Baku"
	x, y := 3, 4
	age = age + 1
	x, y = y, x
	fmt.Println(name, age, city)
	fmt.Println(x, y)
}
Beklenen çıktı
Leyla 15 Baku
4 3
Gereksiz uzun
var count int = 0
var ready bool = false
var title string = "Go course"
Go usulü
var count int
var ready bool
title := "Go course"
İstediğin sıfır değerse onu yazma; var count int zaten 0'dır. Fonksiyon içinde bir başlangıç değeri gerekiyorsa := kullan.

Temel türler ve sıfır değerler

TürÖrnekSıfır değerNot
int42, -70tam sayı; 64 bit sistemlerde 64 bit yer kaplar
float643.140ondalık sayı
string"Baku"""UTF-8 baytları olarak saklanan metin
booltrue, falsefalsemantıksal değer
rune'ə'0tek bir Unicode karakteri (int32'nin diğer adı)
byte'A'0tek bir bayt (uint8'in diğer adı)

Bunların dışında boyutu açıkça belirtilen türler de vardır: int8, int16, int32, int64, işaretsiz uint, uint8… ve float32. Günlük kodda genellikle int, float64, string ve bool yeterlidir.

Tanım
Sıfır değer

Değer verilmeden tanımlanan bir değişkenin otomatik olarak aldığı değer: sayılar için 0, dizeler için boş dize "", bool için false, işaretçiler, dilimler ve map'ler için nil. Go'da hiçbir değişken “rastgele çöp” tutmaz.

Go
package main

import "fmt"

func main() {
	var n int
	var f float64
	var s string
	var ok bool
	fmt.Println(n, f, ok)
	fmt.Printf("%q\n", s)
	fmt.Printf("%T %T %T %T\n", 42, 2.5, "hi", 'A')
}
Beklenen çıktı
0 0 false
""
int float64 string int32

%q bir dizeyi tırnak içinde yazar; böylece boş dize görünür hâle gelir. Dikkat: tek tırnaktaki 'A' bir dize değil, bir rune'dur, yani karakterin Unicode numarasıdır. Bu yüzden türü int32 olarak yazdırılır. Türü belirtilmemiş ondalık bir sayı (2.5) her zaman float64 olur.

Tür dönüşümleri ve aritmetik

Go türleri asla gizlice dönüştürmez: bir int ile bir float64 doğrudan toplanamaz. Dönüşüm açıkça yazılır: float64(a), int(x). İki tam sayının bölümü yine tam sayıdır, yani ondalık kısım atılır; % ise kalanı verir. Dizeler ile sayılar arasındaki dönüşümler için strconv paketi vardır: Itoa sayıyı dizeye, Atoi ise dizeyi sayıya çevirir.

Go
package main

import (
	"fmt"
	"strconv"
)

func main() {
	a, b := 7, 2
	fmt.Println(a/b, a%b)
	fmt.Println(float64(a) / float64(b))
	price := 2.5
	fmt.Println(price * float64(a))
	s := strconv.Itoa(a) + " apples"
	fmt.Println(s)
	n, err := strconv.Atoi("42")
	fmt.Println(n+1, err)
}
Beklenen çıktı
3 1
3.5
17.5
7 apples
43 <nil>

Atoi iki değer döndürür: sayı ve hata. Dönüşüm başarılı olursa hata nil olur ve Println onu <nil> olarak yazar. Hata yönetimini ileride ayrı bir derste ayrıntılı öğreneceksin.

Dizeler ve karakterler

Go'da bir dize değiştirilemez bir bayt dizisidir ve metin UTF-8 olarak saklanır. Latin harfleri bir bayt, ə, ş ve ı gibi harfler ise iki bayt yer kaplar. Bu yüzden len karakterlerin değil, baytların sayısını döndürür. Karakterleri saymak için unicode/utf8 paketindeki RuneCountInString fonksiyonu vardır. strings paketinde birçok hazır araç bulunur: ToUpper, Contains, Replace, Split, TrimSpace ve daha fazlası.

Go
package main

import (
	"fmt"
	"strings"
	"unicode/utf8"
)

func main() {
	city := "Gəncə"
	fmt.Println(len(city), utf8.RuneCountInString(city))
	fmt.Println(strings.ToUpper(city), strings.Contains(city, "ncə"))
	msg := "Welcome to " + city + "!"
	fmt.Println(msg)
	fmt.Println(strings.Replace(msg, "Welcome to", "Hello from", 1))
	fmt.Println(strings.Repeat("=", 10))
}
Beklenen çıktı
7 5
GƏNCƏ true
Welcome to Gəncə!
Hello from Gəncə!
==========

Sabitler ve iota

Bir sabit const ile tanımlanır ve program çalışırken değişemez. Sabitler derleme sırasında hesaplanır; bu yüzden değerleri sayı, dize ya da bool gibi basit bir şey olmalıdır. Parantez içindeki bir sabit grubunda iota, 0'dan başlayan ve her satırda 1 artan bir sayaçtır. Bedenler, haftanın günleri ya da durumlar gibi listeler için kullanışlıdır.

Go
package main

import "fmt"

const Pi = 3.14159

const (
	Small = iota
	Medium
	Large
)

func main() {
	const greeting = "Hello"
	r := 2.0
	fmt.Println(greeting, Pi*r*r)
	fmt.Println(Small, Medium, Large)
}
Beklenen çıktı
Hello 12.56636
0 1 2

Önemli noktalar

  • var x int = 5 uzun biçimdir, x := 5 fonksiyon içindeki kısa tanımlamadır; = yalnızca var olan bir değişkene değer atar.
  • Değer verilmeden tanımlanan bir değişken sıfır değerini alır: 0, "", false ya da nil.
  • Go türleri otomatik dönüştürmez: float64(a), int(x) yaz; tam sayı bölmesi ondalık kısmı atar.
  • strconv.Itoa ve strconv.Atoi sayı ile dize arasında dönüşüm yapar; len dizenin baytlarını, utf8.RuneCountInString karakterlerini sayar.
  • const değiştirilemez bir değer tanımlar; iota, sabit grubunda 0'dan başlayan bir sayaçtır.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
var score int satırından sonra score'un değeri nedir?