← Курсқа оралу

Тегін сынақ сабағы: Golang Developer

Осы курстың бірнеше нақты сабағын өтіңіз — тіркелудің қажеті жоқ.

01

Сабақ 1: Пакеттер, түсініктемелер, айнымалылар және операторлар

Пакеттер. Түсініктемелер.

Go тіліндегі кез келген код пакеттің ішінде сақталады. Пакет — бұл .go файлдары орналасқан қалта.

Go бағдарламасын жасаудың алғашқы қарапайым мысалын қарастырайық:

main.go
package main

import "fmt"

func main() {
    fmt.Println("Salem Bitlab!")
}
Output:Salem Bitlab!
GOLANG
Нәтиже

Осы бағдарламаны орындау үшін біз main және fmt пакеттерін қолдандық.

package main — бұл негізгі пакет. Онда міндетті түрде бағдарламаның кіру нүктесі болып табылатын func main() функциясы болуы керек. Go қосымшасын іске қосқанда, бірінші шақырылатын функция дәл осы.

package fmt — деректерді консольге шығару үшін қолданылатын стандартты пакет. Шығарудан басқа, ол пішімделген енгізу мен шығаруды да қолдайды.

Бағдарлама үлкейген сайын кодты оқып, түсіну қиындай түседі. Бағдарлама логикасын түсінуді жеңілдету үшін түсініктемелер қолданылады.

Түсініктемелер кодты түсіндіру және оны логикалық бөліктерге бөлу үшін қажет. Олар компиляцияға қатыспайды және бағдарламаның орындалуына ешбір әсер етпейді.

Түсініктеме түрлері

Бір жолды түсініктемелер

main.go
package main

import "fmt"

func main() {
    fmt.Println("I like Bitlab Academy!") // мәтінді консольге шығару
}
Output:I like Bitlab Academy!
GOLANG
Нәтиже

Бір жолды түсініктеме белгілі бір жолды немесе код бөлігін қысқаша түсіндіру үшін қолданылады.

Көп жолды түсініктемелер

main.go
package main

import "fmt"

/*
    Бұл бағдарламада
    "fmt" пакеті арқылы
    біз деректерді
    консольге шығарамыз
*/
func main() {
    fmt.Println("I like Bitlab Academy!")
}
Output:I like Bitlab Academy!
GOLANG
Нәтиже

Көп жолды түсініктемелер функцияларды, құрылымдарды және үлкен логикалық код блоктарын толық сипаттау үшін қолданылады.

Айнымалылар және деректер түрлері

Go — статикалық типтелген бағдарламалау тілі. Go компиляторы бағдарламаны іске қоспас бұрын деректер түрлерін тексереді, бұл жоғары сенімділікті, өнімділікті және кодтың оқылуын қамтамасыз етеді.

Go соншалықты жылдам тіл, мен оны бағдарламалау әлеміндегі Флэш деп атаймын.

— Сусликов Битлабхан, пайдалы дағдыларға ие болу саласындағы қоғам таныған қайраткер

Деректер түрлерімен танысудан бұрын, айнымалы деген не екенін түсініп алу керек.

Айнымалы — бұл белгілі бір мәнді сақтайтын жады бөлігі. Әрбір айнымалының деректер түрі болады, ол осы айнымалымен қандай әрекеттер жасауға болатынын анықтайды.

Айнымалыны жариялау мына түрде болады:

main.go
package main

import "fmt"

func main() {
    var age int = 22
    fmt.Println(age)
}
Output:22
GOLANG
Нәтиже

Айнымалыны жариялау үшін біз var кілт сөзін, содан кейін айнымалының атын және оның деректер түрін қолданамыз. Осыдан кейін айнымалыны бағдарламада еркін қолдана аламыз.

Go тілінде айнымалыны жариялаудың қысқа түрі де бар:

main.go
package main

import "fmt"

func main() {
    age := 22
    fmt.Println(age)
}
Output:22
GOLANG
Нәтиже

:= операторын қолданғанда, Go берілген мән негізінде айнымалының түрін өзі анықтайды.

Go-дағы негізгі деректер түрлері

Сандармен жұмыс істеу үшін:

  • int — оң және теріс бүтін сандар
  • uint — тек оң бүтін сандар
  • float32 — бөлшек сандар (32 бит)
  • float64 — бөлшек сандар (64 бит)
  • complex64 — комплекс сандар (2 × float32)
  • complex128 — комплекс сандар (2 × float64)

Мәтінмен жұмыс істеу үшін:

  • string — мәтіндік деректер

Логикалық амалдар үшін:

  • bool — true немесе false

Деректер жиынтықтарымен жұмыс істеу үшін:

  • array — тұрақты ұзындықтағы массив
  • slice — өзгермелі ұзындықтағы массив
  • map — кілт-мән құрылымы
  • struct — әртүрлі деректер түрлерінің бірігуі
  • interface — абстрактілі деректер түрі

Қосымша деректер түрлері:

  • pointer — көрсеткіш
  • function — функция деректер түрі ретінде
  • channel — горутиналар арасындағы байланыс

Математикалық операторлар

Математикалық операторлар сандармен әрекеттер орындауға мүмкіндік береді.

Қосу (+)

a := 2
b := 2
c := a + b // 4
GOLANG
Нәтиже

Азайту (-)

a := 10
b := 5
c := a - b // 5
GOLANG
Нәтиже

Көбейту (*)

a := 3
b := 3
c := a * b // 9
GOLANG
Нәтиже

Бөлу (/)

a := 6
b := 2
c := a / b // 3
GOLANG
Нәтиже

Бөлуден қалған қалдық (%)

a := 7
b := 3
c := a % b // 1
GOLANG
Нәтиже

Инкремент (++)

a := 7
a++ // 8
GOLANG
Нәтиже

Декремент (--)

a := 7
a-- // 6
GOLANG
Нәтиже

Қазірше осы материал жеткілікті — дайындалған тапсырмаларды шығарып жаттығу ұсынылады. Сәттілік!

02

Сабақ 2: Шартты құрылымдар және логикалық операторлар

Go-да шарттар деген не?

Нақты бағдарламаларда код әрдайым жоғарыдан төменге қарай бірдей орындала бермейді. Кейде бағдарлама шешім қабылдауы керек: бір код блогын немесе басқасын орындау.

Мысалы:

  • егер пайдаланушының жасы 18-ден үлкен немесе тең болса — қолжетімділік беру;
  • егер пароль дұрыс болса — жүйеге кіру;
  • егер баланс жеткілікті болса — төлемді орындау;
  • егер баға жоғары болса — сәттілік туралы хабарлама шығару.

Осындай жағдайлар үшін Go-да шартты құрылымдар қолданылады. Олар бағдарламаға қандай кодты орындау керектігін таңдауға мүмкіндік береді.

Шарт — бұл нәтижесі әрқашан true немесе false болатын өрнек.

Шарт қалай жұмыс істейді?

Шартты құрылым өрнекті тексереді. Егер өрнектің нәтижесі true болса, бір код блогы орындалады. Егер нәтиже false болса, бұл блок өткізіп жіберіледі немесе басқа блок орындалады.

if құрылымы

Ең қарапайым шартты құрылым — if. Ол тек шарт ақиқат болған жағдайда ғана кодты орындайды.

main.go
package main

import "fmt"

func main() {
    age := 20

    if age >= 18 {
        fmt.Println("Доступ разрешён")
    }
}
Output:Доступ разрешён
GOLANG
Нәтиже

Мұнда бағдарлама age >= 18 шартын тексереді. age айнымалысының мәні 20-ға тең, сондықтан шарт ақиқат. Демек, if блогының ішіндегі код орындалады.

Маңызды: Go-да if ішіндегі шарт дөңгелек жақшаға алынбайды. Бірақ бұйра жақшалар { } міндетті түрде болуы керек.

if ... else құрылымы

Шарт ақиқат болғанда бір код, ал жалған болғанда басқа код орындалуы керек болса, if ... else құрылымы қолданылады.

main.go
package main

import "fmt"

func main() {
    age := 15

    if age >= 18 {
        fmt.Println("Доступ разрешён")
    } else {
        fmt.Println("Доступ запрещён")
    }
}
Output:Доступ запрещён
GOLANG
Нәтиже

age мәні 15-ке тең. age >= 18 шарты false қайтарады. Сондықтан if блогы орындалмайды, оның орнына else блогы орындалады.

Бірнеше шарт: else if

Кейде екі нұсқа жеткіліксіз болады. Мысалы, студенттің бағасын тексеріп, әртүрлі нәтиже шығару керек. Мұндай жағдайда else if қолданылады.

main.go
package main

import "fmt"

func main() {
    score := 85

    if score >= 90 {
        fmt.Println("Отлично")
    } else if score >= 75 {
        fmt.Println("Хорошо")
    } else if score >= 50 {
        fmt.Println("Можно лучше")
    } else {
        fmt.Println("Не сдал")
    }
}
Output:Хорошо
GOLANG
Нәтиже

Бағдарлама шарттарды жоғарыдан төменге қарай тексереді:

score >= 90 — false
score >= 75 — true
«Хорошо» шығады
қалған шарттар енді тексерілмейді

Салыстыру операторлары

Шарт құру үшін жиі салыстыру операторлары қолданылады. Олар мәндерді салыстырып, true немесе false нәтижесін қайтарады.

  • == — тең
  • != — тең емес
  • > — үлкен
  • < — кіші
  • >= — үлкен немесе тең
  • <= — кіші немесе тең
main.go
package main

import "fmt"

func main() {
    a := 10
    b := 5

    fmt.Println(a == b)
    fmt.Println(a != b)
    fmt.Println(a > b)
    fmt.Println(a < b)
}
Output:false true true false
GOLANG
Нәтиже

Логикалық операторлар

Логикалық операторлар бірнеше шартты біріктіруге мүмкіндік береді. Бұл бір салыстыру жеткіліксіз болғанда пайдалы.

  • && — ЖӘНЕ, екі шарт та true болуы керек
  • || — НЕМЕСЕ, кем дегенде бір шарт true болуы керек
  • ! — ЕМЕС, true-ды false-ке, false-ты true-ға айналдырады

Бірнеше ережені бір мезгілде тексеру керек болса, көбіне && және || операторлары қолданылады.

&& операторымен мысал

&& операторы екі шарттың да ақиқат болуы керек дегенді білдіреді. Мысалы, пайдаланушы жүйеге тек логин мен пароль дұрыс болғанда ғана кіре алады.

main.go
package main

import "fmt"

func main() {
    login := "admin"
    password := "12345"

    if login == "admin" && password == "12345" {
        fmt.Println("Добро пожаловать")
    } else {
        fmt.Println("Неверный логин или пароль")
    }
}
Output:Добро пожаловать
GOLANG
Нәтиже

|| операторымен мысал

|| операторы кем дегенде бір шарттың орындалуы жеткілікті дегенді білдіреді. Мысалы, қала Astana немесе Nur-Sultan деп аталуы мүмкін.

main.go
package main

import "fmt"

func main() {
    city := "Astana"

    if city == "Astana" || city == "Nur-Sultan" {
        fmt.Println("Здравствуй столица")
    } else {
        fmt.Println("Это другой город")
    }
}
Output:Здравствуй столица
GOLANG
Нәтиже

! операторымен мысал

! операторы логикалық өрнектің мәнін керісіне айналдырады. Егер true болса, false болады. Егер false болса, true болады.

main.go
package main

import "fmt"

func main() {
    isBlocked := false

    if !isBlocked {
        fmt.Println("Пользователь активен")
    } else {
        fmt.Println("Пользователь заблокирован")
    }
}
Output:Пользователь активен
GOLANG
Нәтиже

if ішінде инициализациялау

Go-да айнымалыны тікелей if құрылымының ішінде жасауға болады. Мұндай айнымалы тек осы шарттың ішінде ғана қолжетімді болады.

main.go
package main

import "fmt"

func main() {
    if age := 19; age >= 18 {
        fmt.Println("Совершеннолетний")
    } else {
        fmt.Println("Несовершеннолетний")
    }
}
Output:Совершеннолетний
GOLANG
Нәтиже

age айнымалысы шартты тексерместен бұрын жасалады. if ... else құрылымы аяқталғаннан кейін бұл айнымалыны қолдануға болмайды.

switch ... case құрылымы

Бір мәнді бірнеше нұсқамен салыстыру керек болса, switch ... case құрылымын қолданған ыңғайлы.

Нұсқалар көп болғанда ол кодты тазарақ етеді.

main.go
package main

import "fmt"

func main() {
    day := 3

    switch day {
    case 1:
        fmt.Println("Понедельник")
    case 2:
        fmt.Println("Вторник")
    case 3:
        fmt.Println("Среда")
    case 4:
        fmt.Println("Четверг")
    case 5:
        fmt.Println("Пятница")
    default:
        fmt.Println("Выходной или неизвестный день")
    }
}
Output:Среда
GOLANG
Нәтиже

Go-да әрбір case-тен кейін break жазудың қажеті жоқ. Сәйкес келген нұсқа орындалғаннан кейін switch құрылымы автоматты түрде аяқталады.

default ешбір case сәйкес келмегенде орындалады.

Мәні жоқ switch

Go-да switch-ті нақты мәнсіз де қолдануға болады. Бұл жағдайда әрбір case өз алдына жеке шартқа айналады.

main.go
package main

import "fmt"

func main() {
    temperature := 30

    switch {
    case temperature >= 30:
        fmt.Println("Жарко")
    case temperature >= 20:
        fmt.Println("Тепло")
    case temperature >= 10:
        fmt.Println("Прохладно")
    default:
        fmt.Println("Холодно")
    }
}
Output:Жарко
GOLANG
Нәтиже

Практикалық мысалдар

Шарттарды жақсырақ түсіну үшін қарапайым тапсырмаларды шығарған пайдалы.

  • Санның оң немесе теріс екенін тексеру.
  • Санның жұп немесе тақ екенін тексеру.
  • Пайдаланушының жасы бойынша қолжетімділік ала алатынын тексеру.
  • Пайдаланушының логині мен паролін тексеру.
  • Нөмірі бойынша апта күнінің атауын шығару.

Қорытынды

Шартты құрылымдар бағдарламаға шешім қабылдауға мүмкіндік береді. Шарттарсыз толыққанды бағдарлама жазу мүмкін емес, себебі кез келген логика дерлік әртүрлі жағдайларға байланысты болады.

  • if қарапайым тексеру үшін қолданылады;
  • else шарт жалған болғанда орындалады;
  • else if бірнеше нұсқаны тексеру үшін керек;
  • switch мәнді бірнеше нұсқамен салыстыру керек болғанда ыңғайлы;
  • &&, ||, ! шарттарды біріктіруге және өзгертуге мүмкіндік береді.
03

Сабақ 3: Циклдар және for операторы

Цикл дегеніміз не?

Цикл — бұл белгілі бір әрекеттерді бірнеше рет орындауға мүмкіндік беретін нұсқаулар тізбегі.

Бағдарламалауда бір әрекетті бірнеше рет қайталау керек болатын жағдайлар өте жиі кездеседі. Мысалы:

  • 1-ден 10-ға дейінгі сандарды шығару;
  • сандардың қосындысын есептеу;
  • консольден бірнеше мән оқу;
  • студенттер тізімін өңдеу;
  • көбейту кестесін басып шығару.

Циклдарсыз бірдей кодты қолмен көп рет жазуға тура келер еді. Циклдар кодты қысқа, түсінікті және ыңғайлы етеді.

Go тілінде тек бір ғана цикл бар — for, бірақ ол әртүрлі түрде болуы мүмкін.

Цикл қалай жұмыс істейді?

  • алдымен бастапқы мән беріледі;
  • содан кейін шарт тексеріледі;
  • шарт ақиқат болса, цикл денесі орындалады;
  • осыдан кейін мән өзгереді;
  • содан кейін шарт қайта тексеріледі.

Классикалық for

Классикалық for циклі цикл шамамен қанша рет орындалатынын алдын ала білгенде қолданылады.

Мысалы, 0-ден 4-ке дейінгі сандарды шығару керек болса:

main.go
package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
}
Output:0 1 2 3 4
GOLANG
Нәтиже

Цикл құрылымы үш бөліктен тұрады:

  • i := 0 — инициализация (бастапқы мән)
  • i < 5 — шарт (ақиқат болғанша цикл жұмыс істейді)
  • i++ — қадам (әр итерациядан кейін айнымалыны өзгерту)

Осылайша цикл 5 рет орындалды — i саны 5-ке тең болғанша.

Мысал: 1-ден 10-ға дейінгі сандарды шығару

Белгілі бір диапазондағы сандарды шығару өте жиі кездесетін тапсырма. Ол үшін қарапайым for циклін қолдануға болады.

main.go
package main

import "fmt"

func main() {
    for i := 1; i <= 10; i++ {
        fmt.Println(i)
    }
}
Output:1 2 3 4 5 6 7 8 9 10
GOLANG
Нәтиже

Бұл мысалда i айнымалысы 1-ден басталады. Цикл i <= 10 болғанша жұмыс істейді. Әр итерациядан кейін i мәні 1-ге артады.

Мысал: сандардың қосындысы

Циклдар нәтижені жинақтау үшін жиі қолданылады. Мысалы, 1-ден 5-ке дейінгі сандардың қосындысын есептеуге болады.

main.go
package main

import "fmt"

func main() {
    sum := 0

    for i := 1; i <= 5; i++ {
        sum = sum + i
    }

    fmt.Println(sum)
}
Output:15
GOLANG
Нәтиже

Мұнда sum айнымалысы жалпы нәтижені сақтайды. Әр итерацияда біз оған i-дің ағымдағы мәнін қосамыз.

sum қалай өзгереді:

  • i = 1, sum = 0 + 1 = 1
  • i = 2, sum = 1 + 2 = 3
  • i = 3, sum = 3 + 3 = 6
  • i = 4, sum = 6 + 4 = 10
  • i = 5, sum = 10 + 5 = 15

Мысал: тек жұп сандарды шығару

Цикл ішінде шартты құрылымдарды қолдануға болады. Мысалы, 1-ден 10-ға дейінгі сандар бойынша жүріп, тек жұп сандарды шығаруға болады.

main.go
package main

import "fmt"

func main() {
    for i := 1; i <= 10; i++ {
        if i%2 == 0 {
            fmt.Println(i)
        }
    }
}
Output:2 4 6 8 10
GOLANG
Нәтиже

i%2 == 0 шарты санның 2-ге қалдықсыз бөлінетінін тексереді. Егер қалдық 0 болса, сан жұп болғаны.

for-дің while ретіндегі түрі

Go тілінде бөлек while кілт сөзі жоқ. Бірақ тек шартты қалдырсаңыз, for циклін while ретінде қолдануға болады.

main.go
package main

import "fmt"

func main() {
    i := 1
    for i < 10 {
        fmt.Println(i)
        i++
    }
}
Output:1 2 3 4 5 6 7 8 9
GOLANG
Нәтиже

Бұрынғыдай — цикл шарт ақиқат болғанша жұмыс істейді. Бұл жағдайда — i < 10 болғанша.

Шексіз цикл

Егер for-ды шартсыз жазсаңыз, шексіз цикл пайда болады. Мұндай цикл біз оны қолмен тоқтатпайынша немесе break қолданбайынша шексіз жұмыс істейді.

main.go
package main

import "fmt"

func main() {
    i := 1

    for {
        fmt.Println(i)
        i++

        if i > 5 {
            break
        }
    }
}
Output:1 2 3 4 5
GOLANG
Нәтиже

Маңызды: шексіз циклді абайлап қолдану керек. Егер шығу шартын ұмытып кетсеңіз, бағдарлама шексіз жұмыс істеуі мүмкін.

break операторы

break операторы циклді мерзімінен бұрын аяқтауға мүмкіндік береді. Ол керекті мәнді тапқанда және циклді жалғастырғымыз келмегенде пайдалы.

main.go
package main

import "fmt"

func main() {
    for i := 1; i <= 10; i++ {
        if i == 6 {
            break
        }

        fmt.Println(i)
    }
}
Output:1 2 3 4 5
GOLANG
Нәтиже

i саны 6-ға тең болғанда, break іске қосылады. Цикл дереу аяқталады, сондықтан 6 саны және одан кейінгі сандар шығарылмайды.

continue операторы

continue операторы ағымдағы итерацияны өткізіп жіберіп, келесісіне дереу өтеді. Ол кейбір мәндерді өткізіп жіберу керек болғанда пайдалы.

main.go
package main

import "fmt"

func main() {
    for i := 1; i <= 5; i++ {
        if i == 3 {
            continue
        }

        fmt.Println(i)
    }
}
Output:1 2 4 5
GOLANG
Нәтиже

i саны 3-ке тең болғанда, continue орындалады. Сондықтан бұл сан үшін fmt.Println(i) өткізіп жіберіледі.

Деректер енгізетін цикл

Циклдарды консольден деректер оқу үшін де қолдануға болады. Мысалы, пайдаланушы 0 енгізгенше сандарды енгізуге болады.

main.go
package main

import "fmt"

func main() {
    var number int

    for {
        fmt.Scan(&number)

        if number == 0 {
            break
        }

        fmt.Println(number)
    }
}

Бұл мысалда цикл шексіз жұмыс істейді, бірақ пайдаланушы 0 санын енгізгенде аяқталады.

Мұндай тәсіл пайдаланушы қанша мән енгізетіні алдын ала белгісіз болғанда жиі қолданылады.

Кірістірілген циклдар

Цикл басқа циклдің ішінде болуы мүмкін. Мұндай тәсіл кірістірілген циклдар деп аталады.

Ең танымал мысалдардың бірі — көбейту кестесі.

main.go
package main

import "fmt"

func main() {
    for i := 1; i < 10; i++ {
        for j := 1; j < 10; j++ {
            fmt.Print(i*j, "\t")
        }
        fmt.Println()
    }
}
Output:1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
GOLANG
Нәтиже

Көбейту кестесі шықты: көлденеңінен i, тігінен — j. Әрбір цикл өз айнымалысы 10-нан кіші болғанша жұмыс істейді.

Бұл қалай жұмыс істейді:

  • сыртқы цикл жолдарға жауап береді;
  • ішкі цикл бағандарға жауап береді;
  • әр итерацияда i * j нәтижесі шығарылады;
  • ішкі цикл аяқталғаннан кейін жаңа жолға көшу орындалады.

Кірістірілген цикл мысалы: жұлдызшалардан тұратын тіктөртбұрыш

Кірістірілген циклдар консольде қарапайым фигураларды салу үшін жиі қолданылады. Мысалы, * таңбаларынан тұратын тіктөртбұрышты шығаруға болады.

main.go
package main

import "fmt"

func main() {
    for i := 1; i <= 3; i++ {
        for j := 1; j <= 5; j++ {
            fmt.Print("*")
        }
        fmt.Println()
    }
}
Output:***** ***** *****
GOLANG
Нәтиже

Сыртқы цикл 3 рет орындалып, 3 жол жасайды. Ішкі цикл 5 рет орындалып, әр жолда 5 жұлдызша басып шығарады.

for range циклі

Go тілінде for range түрі жиі қолданылады. Ол деректер жиынын аралап шығу керек болғанда ыңғайлы.

Мысалы, есімдер тізімін аралап шығуға болады:

main.go
package main

import "fmt"

func main() {
    names := []string{"Aibek", "Dana", "Miras"}

    for index, name := range names {
        fmt.Println(index, name)
    }
}
Output:0 Aibek 1 Dana 2 Miras
GOLANG
Нәтиже

index айнымалысы элементтің нөмірін сақтайды, ал name айнымалысы мәннің өзін сақтайды.

Индекс керек болмаса

Кейде бізге тек мән керек, ал индекс керек болмайды. Мұндай жағдайда индекстің орнына _ таңбасын қолдануға болады.

main.go
package main

import "fmt"

func main() {
    names := []string{"Aibek", "Dana", "Miras"}

    for _, name := range names {
        fmt.Println(name)
    }
}
Output:Aibek Dana Miras
GOLANG
Нәтиже

_ таңбасы бұл мән бізге керек емес дегенді білдіреді.

Циклдармен жұмыс істегендегі жиі кездесетін қателер

  • цикл айнымалысын өзгертуді ұмыту;
  • әрқашан ақиқат болатын шарт жазу;
  • break-сіз шексіз цикл жасау;
  • цикл шектерін дұрыс көрсетпеу;
  • < және <= таңбаларын шатастыру.

Мини-практика

Циклдарды жақсырақ меңгеру үшін келесі тапсырмаларға бағдарлама жазып көріңіз:

  • 1-ден 100-ге дейінгі сандарды шығару;
  • 1-ден 50-ге дейінгі тек тақ сандарды шығару;
  • 1-ден N-ге дейінгі сандардың қосындысын есептеу;
  • бір сан үшін көбейту кестесін шығару;
  • пайдаланушы 0 енгізгенше сандарды енгізу;
  • енгізілген сандардың ішінен ең үлкенін табу;
  • * таңбаларынан тұратын шаршыны шығару.

Қорытынды

Циклдар бір кодты көп рет орындауға мүмкіндік береді. Go тілінде ол үшін тек for циклі қолданылады, бірақ ол әртүрлі түрде жазылуы мүмкін.

  • классикалық for цикл шектері белгілі болғанда ыңғайлы;
  • for while ретінде тек шартты тексеру маңызды болғанда ыңғайлы;
  • шексіз for break операторымен бірге қолданылады;
  • break циклді аяқтайды;
  • continue ағымдағы итерацияны өткізіп жібереді;
  • кірістірілген циклдар кестелер мен фигуралармен жұмыс істеуге мүмкіндік береді;
  • for range деректер жиындарын аралап шығу үшін қолданылады.
04

Сабақ 4: Тілімдер

Тілім дегеніміз не?

Тілім (slice) — бір типтегі элементтердің ретті жиынтығы. Массивтерден айырмашылығы, тілімдердің ұзындығы динамикалық: оларға жаңа элементтер қосуға және барларын жоюға болады.

Тілімдер массивтерге өте ұқсас, бірақ нақты әзірлемеде әлдеқайда ыңғайлы. Массивтің өлшемі тұрақты болса, тілім қажеттілікке қарай өсе алады.

Сондықтан Go тілінде әдетте кәдімгі массивтермен емес, тілімдермен жұмыс істейді.

Тілімдер қазақ тойы сияқты: 200 адамға іс-шара жоспарлауға болады, ал соңында қанша қонақ келетіні белгісіз. Бәлкім 150? 250? Немесе тұтас 300? Тілімдер той ұйымдастырушылары сияқты бір қасиетке ие — икемділік.

Мейрам "Уақтылық" Тойбастаров — "ешқашан" кешікпейтін және тілімдерден хабардар кісі

Тілім мен массивтің басты айырмашылығы — тілімнің ұзындығы программа жұмыс істеп тұрған кезде өзгере алады.

Массив vs тілім

Көрнекі түрде массив пен тілім бір-біріне өте ұқсас, бірақ олардың арасында маңызды айырмашылық бар.

Массив

Өлшемі тұрақты. Егер массив 5 элементке жасалса, ол әрқашан дәл 5 элементтен тұрады.

Тілім

Өлшемі динамикалық. Тілімге элементтер қосып, жаңа, үлкейтілген тілім алуға болады.

Go тілінде тілім массив сияқты жазылады, тек шаршы жақшаның ішінде өлшемі көрсетілмейді.

Тілім жасау

Тілімдер массивтер сияқты жасалады, тек жасау кезінде ұзындығы көрсетілмейді.

Main.go
package main

import "fmt"

func main() {
    boxers := []string{"Muhammad Ali", "Mike Tyson", "George Foreman", "Joe Frazier"}
    for _, value := range boxers {
        fmt.Println(value)
    }
}
Output:Muhammad Ali Mike Tyson George Foreman Joe Frazier
GOLANG
Нәтиже

Назар аударыңыз: [] ішінде біз ұзындықты көрсеткен жоқпыз — дәл осы себепті бұл slice.

Егер [4]string деп жазсақ, бұл массив болады. Ал []string деп жазсақ, бұл тілім болады.

Әртүрлі типтегі тілім

Тілім әртүрлі деректер типіндегі элементтерді сақтай алады, бірақ бір тілімнің ішінде барлық элементтер бір типті болуы керек.

Сандар тілімі:

numbers := []int{10, 20, 30, 40}

Жолдар тілімі:

cities := []string{"Almaty", "Astana", "Paris"}

Логикалық мәндер тілімі:

answers := []bool{true, false, true}

make() арқылы тілім жасау

Тілімдерді make() функциясы арқылы да жасауға болады:

Main.go
package main

import "fmt"

func main() {
    cities := make([]string, 4)
    cities[0] = "Almaty"
    cities[1] = "Astana"
    cities[2] = "New-York"
    cities[3] = "Washington"

    for _, value := range cities {
        fmt.Println(value)
    }
}
Output:Almaty Astana New-York Washington
GOLANG
Нәтиже

make([]string, 4) деп жазғанда, Go ұзындығы 4 болатын жолдар тілімін жасайды. Содан кейін біз 0-ден 3-ке дейінгі индекстер бойынша элементтерге жүгіне аламыз.

Енді элементтерді қалай қосу, жою керектігін және тілім операторы дегеніміз не екенін қарастырайық.

Ұзындығы мен сыйымдылығы: len және cap

Тілімнің екі маңызды сипаттамасы бар: ұзындығы және сыйымдылығы.

  • len — тілімде қазір қанша элемент бар;
  • cap — қазіргі ішкі массивке қанша элемент сыяды.
Main.go
package main

import "fmt"

func main() {
    numbers := []int{10, 20, 30}

    fmt.Println(len(numbers))
    fmt.Println(cap(numbers))
}
Output:3 3
GOLANG
Нәтиже

Басында len мен cap көбіне тең болады. Бірақ append арқылы элементтер қосқаннан кейін сыйымдылық өзгеруі мүмкін.

Элементтерді қосу (append)

Тілімге элемент қосу үшін append(slice, value) функциясы қолданылады.

Main.go
package main

import "fmt"

func main() {
    cities := []string{"Almaty", "Astana"}

    cities = append(cities, "Paris")
    cities = append(cities, "Marcel")

    for _, value := range cities {
        fmt.Println(value)
    }
}
Output:Almaty Astana Paris Marcel
GOLANG
Нәтиже

Нәтижені айнымалыға қайта сақтау маңызды: cities = append(cities, "Paris"). append функциясы жаңа тілім қайтарады.

Бірнеше элемент қосу

append арқылы бірден бірнеше элемент қосуға болады.

Main.go
package main

import "fmt"

func main() {
    numbers := []int{1, 2, 3}

    numbers = append(numbers, 4, 5, 6)

    fmt.Println(numbers)
}
Output:[1 2 3 4 5 6]
GOLANG
Нәтиже

Бір тілімді екінші тілімге қосу

Кейде бір мән емес, басқа тілімнің барлық элементтерін қосу керек болады. Ол үшін ... қолданылады.

Main.go
package main

import "fmt"

func main() {
    first := []int{1, 2, 3}
    second := []int{4, 5, 6}

    first = append(first, second...)

    fmt.Println(first)
}
Output:[1 2 3 4 5 6]
GOLANG
Нәтиже

Үш нүкте ... екінші тілімді жеке элементтер жиынтығы ретінде ашады.

Тілім операторы (s[i:j])

Тілім операторы былай жазылады: s[i:j], мұндағы:

  • s — бастапқы тілім
  • i — бастапқы индекс (қоса алғанда)
  • j — соңғы индекс (қоспағанда)
Индекс Мән
0 Almaty
1 Astana
2 New-York
3 Washington

Мысалы, cities[0:2] деп жазсақ, 0 және 1 индекстеріндегі элементтерді аламыз. 2 индексіндегі элемент нәтижеге кірмейді.

Main.go
package main

import "fmt"

func main() {
    cities := []string{"Almaty", "Astana", "New-York", "Washington", "Paris", "Marcel"}

    kzCities := cities[0:2]
    usaCities := cities[2:4]
    frCities := cities[4:6]

    fmt.Println(kzCities)  // Almaty, Astana
    fmt.Println(usaCities) // New-York, Washington
    fmt.Println(frCities)  // Paris, Marcel
}
Output:[Almaty Astana] [New-York Washington] [Paris Marcel]
GOLANG
Нәтиже

Тілімнің қысқа түрлері

Go тілінде бастапқы немесе соңғы индексті көрсетпеуге болады.

  • s[:3] — басынан бастап 3-индекске дейін алу, 3-ті қоспағанда;
  • s[2:] — 2-индекстен соңына дейін алу;
  • s[:] — тілімнің барлығын алу.
Main.go
package main

import "fmt"

func main() {
    numbers := []int{10, 20, 30, 40, 50}

    fmt.Println(numbers[:3])
    fmt.Println(numbers[2:])
    fmt.Println(numbers[:])
}
Output:[10 20 30] [30 40 50] [10 20 30 40 50]
GOLANG
Нәтиже

Тілім элементін өзгерту

Массивтердегідей, тілім элементтерін индекс бойынша өзгертуге болады.

Main.go
package main

import "fmt"

func main() {
    cities := []string{"Almaty", "Astana", "Paris"}

    cities[2] = "London"

    fmt.Println(cities)
}
Output:[Almaty Astana London]
GOLANG
Нәтиже

Мұнда 2-индекстегі элемент Paris-тен London-ға ауыстырылды.

Элементті жою

Жою әдетте append пен тілім операторын біріктіру арқылы жасалады. Біз индекске дейінгі элементтер мен индекстен кейінгі элементтерді алып, содан кейін оларды "жабыстырамыз".

Main.go
package main

import "fmt"

func main() {
    capitals := []string{"Astana", "Washington", "Marcel", "Paris"}

    num := 2 // 2-индекстегі элементті жоямыз (Marcel)
    capitals = append(capitals[:num], capitals[num+1:]...)
    fmt.Println(capitals)
}
Output:[Astana Washington Paris]
GOLANG
Нәтиже

Маңызды: capitals[:num] — num-ге дейінгі элементтер, ал capitals[num+1:] — num-нен кейінгі элементтер. Үш нүкте ... тілімді аргументтер жиынтығы ретінде "ашады".

Бұл қалай жұмыс істейді:

  • capitals[:2] — [Astana Washington] береді;
  • capitals[3:] — [Paris] береді;
  • append осы бөліктерді біріктіреді;
  • Marcel элементі нәтижеден жоғалады.

range арқылы тілімді аралау

Тілімдерді range арқылы аралау ыңғайлы. Біз индексті де, мәнді де ала аламыз.

Main.go
package main

import "fmt"

func main() {
    cities := []string{"Almaty", "Astana", "Paris"}

    for index, value := range cities {
        fmt.Println(index, value)
    }
}
Output:0 Almaty 1 Astana 2 Paris
GOLANG
Нәтиже

Индекс керек болмаса

Егер тек элемент керек болса, индексті _-ге ауыстыруға болады.

Main.go
package main

import "fmt"

func main() {
    cities := []string{"Almaty", "Astana", "Paris"}

    for _, value := range cities {
        fmt.Println(value)
    }
}
Output:Almaty Astana Paris
GOLANG
Нәтиже

Мысал: тілім элементтерінің қосындысы

Тілімдер циклдармен бірге жиі қолданылады. Мысалы, тілімдегі барлық сандардың қосындысын есептеуге болады.

Main.go
package main

import "fmt"

func main() {
    numbers := []int{10, 20, 30, 40}
    sum := 0

    for _, value := range numbers {
        sum = sum + value
    }

    fmt.Println(sum)
}
Output:100
GOLANG
Нәтиже

Мысал: ең үлкен санды табу

Цикл мен тілім көмегімен ең үлкен санды табуға болады.

Main.go
package main

import "fmt"

func main() {
    numbers := []int{15, 90, 12, 45, 7}
    max := numbers[0]

    for _, value := range numbers {
        if value > max {
            max = value
        }
    }

    fmt.Println(max)
}
Output:90
GOLANG
Нәтиже

Тілімдермен жұмыс істеудегі жиі кездесетін қателер

  • append нәтижесін айнымалыға қайта сақтауды ұмыту;
  • тілімде жоқ индекске жүгіну;
  • [5]int массиві мен []int тілімін шатастыру;
  • s[i:j]-дегі соңғы индекстің кірмейтінін ұмыту;
  • бір тілімді екіншісіне қосқанда ... қоюды ұмыту.

Мини-практика

Тілімдерді жақсырақ меңгеру үшін мына тапсырмаларға программа жазып көріңіз:

  • 5 саннан тұратын тілім жасап, барлық элементтерін шығарыңыз;
  • тілімге append арқылы тағы бірнеше сан қосыңыз;
  • тілімнің тек алғашқы 3 элементін шығарыңыз;
  • 2-индекстен соңына дейінгі элементтерді шығарыңыз;
  • индекс бойынша элементті жойыңыз;
  • барлық элементтердің қосындысын есептеңіз;
  • ең үлкен санды табыңыз;
  • тек оң сандарды шығарыңыз.

Қорытынды

  • тілім массивке ұқсайды, бірақ ұзындығы динамикалық;
  • тілім []тип арқылы, өлшемін көрсетпей жасалады;
  • make қажетті ұзындықтағы тілім жасауға мүмкіндік береді;
  • append жаңа элементтер қосады;
  • s[i:j] тілімнің бір бөлігін алуға мүмкіндік береді;
  • s[i:j]-дегі соңғы индекс кірмейді;
  • элементтерді индекс бойынша өзгертуге болады;
  • жоюды append пен тілім операторы арқылы жасауға болады;
  • range тілімді аралау үшін ыңғайлы.

Өтінім қалдыру

Байланыс деректеріңізді қалдырыңыз — қабылдау бөлімі сізге хабарласып, дұрыс курс таңдауға көмектеседі.

Форманы жіберу арқылы сіз BITLAB Academy-мен өтініміңіз бойынша байланысуға келісесіз.