Məzmuna keç
Educora
Başlanğıc14 dəq2 / 10

Dəyişənlər, tiplər və sabitlər

`var` və `:=` ilə dəyişənlər elan et, əsas tipləri, sıfır qiymətləri, tip çevirmələrini, sətirləri və `iota` ilə sabitləri öyrən.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Dəyişənləri var və := ilə elan etmək və fərqini izah etmək
  • Əsas tipləri və onların sıfır qiymətlərini tanımaq
  • Tipləri açıq şəkildə çevirmək və strconv ilə sətir–ədəd çevirmələri etmək
  • const və iota ilə sabitlər yaratmaq

Tutaq ki, oyun yazırsan. Oyunçunun adını, xallarını, səviyyəsini və onlayn olub-olmadığını harada saxlamalı? Dəyişənlərdə. Go-da hər dəyişənin dəqiq tipi var və kompilyator ona uyğun olmayan qiyməti yazmağa icazə vermir. Bu dərsdə dəyişən və sabitləri elan etməyi, əsas tipləri və onların çevrilməsini öyrənəcəksən.

Dəyişənləri elan etmək

Go-da dəyişəni iki yolla elan etmək olar. Uzun forma var açar sözü ilə yazılır: var age int = 14. Qiymət verilibsə, tipi yazmamaq da olar — Go onu özü müəyyən edir. Funksiyaların içində isə ən çox qısa elan işlədilir: city := "Baku". := yeni dəyişən yaradır, adi = isə artıq mövcud dəyişənə yeni qiymət verir.

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)
}
Gözlənilən nəticə
Leyla 15 Baku
4 3
Artıq yazı
var count int = 0
var ready bool = false
var title string = "Go course"
Go üslubu
var count int
var ready bool
title := "Go course"
Sıfır qiymət kifayətdirsə, onu yazma — var count int artıq 0-dır. Başlanğıc qiymət lazımdırsa, funksiyanın içində := işlət.

Əsas tiplər və sıfır qiymətlər

TipNümunəSıfır qiymətQeyd
int42, -70tam ədəd; 64 bitli sistemlərdə 64 bit tutur
float643.140kəsr ədəd
string"Baku"""mətn, UTF-8 baytları şəklində
booltrue, falsefalseməntiqi qiymət
rune'ə'0bir Unicode simvolu (int32-nin başqa adı)
byte'A'0bir bayt (uint8-in başqa adı)

Bundan başqa ölçüsü dəqiq göstərilən tiplər də var: int8, int16, int32, int64, işarəsiz uint, uint8… və float32. Gündəlik işdə adətən int, float64, string və bool kifayət edir.

Tərif
Sıfır qiymət

Qiymət verilmədən elan olunan dəyişənin avtomatik aldığı qiymət: ədədlər üçün 0, sətir üçün boş sətir "", bool üçün false, göstəricilər, dilimlər və xəritələr üçün nil. Go-da «təsadüfi zibil» saxlayan dəyişən olmur.

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')
}
Gözlənilən nəticə
0 0 false
""
int float64 string int32

%q sətri dırnaq içində göstərir — belə boş sətri görmək asandır. Diqqət et: tək dırnaqdakı 'A' sətir deyil, rune-dur, yəni simvolun Unicode nömrəsi. Ona görə onun tipi int32 kimi çap olunur. Tipi göstərilməyən kəsr ədəd (2.5) həmişə float64 olur.

Tip çevirmələri və hesab əməlləri

Go tipləri heç vaxt gizlicə çevirmir: int ilə float64-ü birbaşa toplamaq olmur. Çevirmə açıq yazılır: float64(a), int(x). İki tam ədədin bölünməsi yenə tam ədəddir — kəsr hissə atılır, % isə qalığı verir. Sətir ilə ədəd arasında çevirmə üçün strconv paketi var: Itoa ədədi sətrə, Atoi isə sətri ədədə ç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)
}
Gözlənilən nəticə
3 1
3.5
17.5
7 apples
43 <nil>

Atoi iki qiymət qaytarır: ədəd və xəta. Çevirmə uğurlu olanda xəta nil olur və Println onu <nil> kimi çap edir. Xətalarla işləməyi ayrıca dərsdə ətraflı öyrənəcəksən.

Sətirlər və simvollar

Go-da sətir dəyişməz baytlar ardıcıllığıdır və mətn UTF-8 kodlaşdırmasında saxlanılır. Latın hərfləri bir bayt tutur, ə, ş, ı kimi hərflər isə iki bayt. Ona görə len simvolların yox, baytların sayını qaytarır. Simvolları saymaq üçün unicode/utf8 paketindəki RuneCountInString funksiyası var. strings paketində isə hazır alətlər çoxdur: ToUpper, Contains, Replace, Split, TrimSpace və s.

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))
}
Gözlənilən nəticə
7 5
GƏNCƏ true
Welcome to Gəncə!
Hello from Gəncə!
==========

Sabitlər və iota

Sabit const ilə elan olunur və proqram işləyərkən dəyişə bilməz. Sabitlər kompilyasiya zamanı hesablanır, ona görə onların qiyməti ədəd, sətir və ya bool kimi sadə qiymət olmalıdır. Mötərizədəki sabitlər qrupunda iota 0-dan başlayan sayğacdır: hər növbəti sətirdə 1 artır. Bu, ölçülər, həftənin günləri və ya statuslar kimi siyahılar üçün əlverişlidir.

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)
}
Gözlənilən nəticə
Hello 12.56636
0 1 2

Əsas fikirlər

  • var x int = 5 uzun formadır, x := 5 isə funksiyanın içində qısa elandır; = yalnız mövcud dəyişənə qiymət verir.
  • Qiymətsiz elan olunan dəyişən sıfır qiymət alır: 0, "", false və ya nil.
  • Go tipləri avtomatik çevirmir: float64(a), int(x) yaz; tam ədədlərin bölünməsi kəsr hissəni atır.
  • strconv.Itoa və strconv.Atoi ədədlə sətir arasında çevirir; len sətrin baytlarını, utf8.RuneCountInString simvollarını sayır.
  • const dəyişməz qiymətdir; iota sabitlər qrupunda 0-dan başlayan sayğacdır.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
var score int sətrindən sonra score-un qiyməti nədir?