Shanraq.org Shanraq.org
Go-дағы тармақталу мен цикл: if, else және жалғыз for
IT

Go тілі: нөлден өз блогыңызға дейін 6-сабақ (барлығы 50)

Go-дағы тармақталу мен цикл: if, else және жалғыз for

Go курсының алтыншы сабағы. Бағдарлама екі жолдың бірін қалай таңдайды: if, else if және else, салыстырулар мен ЖӘНЕ, НЕМЕСЕ, ЕМЕС. Ал цикл Go-да дәл біреу — for сөзі, бірақ үш пішінде: санауышпен, шарт бойынша және шартсыз, break арқылы. Тілде while де, foreach те жоқ.

Не үшін керек

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

Ал әрекетті он рет қайта жазбай қайталау үшін цикл керек. Міне, осы жерде Go әдеттен тыс: цикл онда біреу. while, do-while және foreach сөздері тілде жоқ — мұның бәрін for істейді, тек әртүрлі пішінде.

Бірден тұтас

Жаңа қалта, go mod init sabaq05, main.go:

package main

import "fmt"

func label(views int) string {
	if views >= 1000 {
		return "танымал"
	} else if views >= 100 {
		return "оқып жатыр"
	}
	return "жаңа"
}

func main() {
	fmt.Println(12, "—", label(12))
	fmt.Println(340, "—", label(340))
	fmt.Println(1500, "—", label(1500))

	for i := 1; i <= 3; i++ {
		fmt.Println("сабақ", i)
	}

	words := 0
	for words < 600 {
		words += 200
	}
	fmt.Println("жиналған сөз:", words)
}

Іске қоспас бұрын — төменге қарамай, оның не басып шығаратынын дауыстап айтыңыз. Содан кейін жіберіп, салыстырыңыз: айырма шыққан жер — тілді әлі білмейтін тұсыңыз.

go run . мынаны басады:

12 — жаңа
340 — оқып жатыр
1500 — танымал
сабақ 1
сабақ 2
сабақ 3
жиналған сөз: 600

Талдау

if: айрық

if views >= 1000 {

Шарт дөңгелек жақшасыз жазылады — Go-да олар керек емес және қойылмайды. Дене әрқашан фигуралық жақшада, ішінде бір жол болса да: жақшасыз қысқа жазу тілде жоқ, ал бұл басқа тілдерде сүрінетін бір топ қатеден құтқарады.

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

else if және else

Тексерулер жоғарыдан төмен жүреді, алғаш сәйкес келгені орындалады. Сондықтан рет маңызды: >= 100 дегенді >= 1000 үстіне қойсаңыз, мың «оқып жатыр» дегенге түсіп, екінші тексеруге кезек жетпейді.

Соңында else міндетті емес. Мысалда ол жоқ: барлық тексеруден кейін жай ғана return "жаңа" тұр — мағынасы сол, бір жол қысқа.

Немен салыстырады

== тең, != тең емес, < > <= >=. Салыстырудағы қос теңдік пен меншіктеудегі жалғыз теңдік — бөлек нәрсе, Go оларды шатастыруға жол бермейді: if views = 1000 жиналмайды.

Шарттарды біріктіреді: && — екеуі де; || — кем дегенде біреуі; ! — керісінше.

if views >= 100 && views < 1000 {

Санауышы бар for

for i := 1; i <= 3; i++ {

Нүктелі үтірмен бөлінген үш бөлік: санауыш ашу, қашанға дейін тексеру, әр айналымнан кейін не істеу. i++ — бірге арттыру.

Елестетіп көріңіз. Қоймашыға айтылатын үш нәрсе: қай сөреден бастау, қайсысына дейін санау және неше қадаммен жүру. Үшеуін де айтсаңыз, ол қойманы өзі аралап шығады.

Шарт бойынша for

for words < 600 {

Үштің орнына бір бөлік. Басқа тілдерде мұны while дейді; Go-да бұл сол for, тек санауышсыз және қадамсыз.

Шартсыз for

for {
	// шыға ғой дегенше
}

Ішінде break кездескенше мәңгі айналады. Серверлер мен оқиға күту осылай жазылады.

break циклден мүлдем шығады. continue ағымдағы айналымды тастап, келесісін бастайды.

Елестетіп көріңіз. Кезек. break — кезектен біржола кету. continue — өз қадамыңызды өткізіп жіберіп, бастағаныңызды бітірмей келесіге көшу.

Қысқа жариялауы бар if

Мұнда өткен сабақ оралады. Функция екі мән береді, екеуі де тек тексерудің ішінде керек:

if minutes, ok := readingTime(700); ok {
	fmt.Println(minutes)
}

Нүктелі үтір жариялауды шарттан бөледі. minutes пен ok тек осы if ішінде өмір сүреді, сыртта жоқ — демек кедергі келтірмейді және басқа аттармен шатаспайды. Нәтиже дәл бір тексеруге керек болғанда Go-да әрдайым дерлік осылай жазады.

Төртінші пішін — кейін

for-дың тағы бір жазуы бар, range: ол бөліктерден тұратынды аралайды — жолды әріптеп, тізімді элементтеп. Жолмен келесі сабақта кездесеміз, тізіммен — тілімдер туралы сабақта.

Функция өзін-өзі шақыра алады

Қайталаудың жалғыз жолы — цикл емес. Функция өзін-өзі шақыра алады, әрі мұны рекурсия деп атайды:

func countdown(n int) {
	if n == 0 {
		fmt.Println("кеттік")
		return
	}
	fmt.Println(n)
	countdown(n - 1)
}

func main() {
	countdown(3)
}
3
2
1
кеттік

Мұнда екі бөлік бар, әрі екеуі де міндетті. Бірінші — шығу: if n == 0 және return, яғни функция өзін бұдан әрі шақырмайтын жағдай. Екінші — сол шығуға жақындататын қадам: countdown(n - 1), әр жолы кішірек санмен.

Шығуды алып тастаңыз — бағдарлама тоқтамайды. Go оны мәңгі ілініп тұруға қоймайды, бірақ алғыс та айтпайды:

runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow

Әр шақыру жадтан орын алады, ал орын біткенде бағдарлама құлайды. for циклі бұлай құлай алмайды: ол шақыруларды жинамайды.

Елестетіп көріңіз. Матрёшка. Оны ашасыз, ішінде дәл сондай кішірегі, солай ең кішісіне дейін — ол енді ашылмайды. Кішісі болмаса, шексіз ашып отырар едіңіз.

Оны цикл орнына қашан таңдайды: дерек өз-өзіне ұя салып тұрғанда. Пікірге жазылған пікір, қалта ішіндегі қалта, жауапқа берілген жауап — мұндайды циклмен айналып өту қиын, ал рекурсиямен табиғи. Жазық тізім үшін цикл қарапайым әрі жылдам, сондықтан бұл курста барлық жерде дерлік цикл болады.

Сабақ картасы

Сабақ картасы: бір for сөзі, үш пішін

Өз сөзіңізбен айтыңыз

Қарамай, дауыстап немесе қағазға жазып жауап беріңіз. Жауаптары — сабақтың соңында.

  1. label ішінде тексерулердің ретін неге ауыстыруға болмайды?
  2. break пен continue айырмашылығы неде?
  3. n мен ok дегенді жоғарғы жолда жариялауға болатын бола тұра, неге if n, ok := f(); ok деп жазады?

Тапсырма

Міндетті. label(views int) string функциясын жазыңыз: 1000 және одан көп болса "танымал", 100 және одан көп болса "оқып жатыр", әйтпесе "жаңа" қайтарады. Оны main ішінен 12, 340 және 1500 үшін шақырып, нәтижесін басып шығарыңыз.

Қалауыңызша.

  • 1-ден 10-ға дейінгі санауышы бар цикл, тек жұп сандарды басады. Кеңес: бөлуден қалған қалдық — %, жұп деген i%2 == 0.
  • Өткен сабақтың if күтіп қалған тапсырмасына оралыңыз: readingTime екі мән қайтаратын етіңіз — минут және сөз саны орынды ма деген bool.
  • Бесінші айналымда break арқылы шығатын шартсыз for.

Блогта қайда тұрады

Блогта тармақталу барлық жерде: мақаланы көрсету немесе 404 қайтару, өңдеуге жіберу немесе бас тарту, «пікір жоқ» деп жазу немесе тізім шығару. Ал цикл мақала біреуден көбейген бойда керек болады — тілімдер туралы сабақта олардың бәрін бір жолмен аралайсыз.

Жауаптар

Жауаптарды көрсету
  1. Себебі ең дәл емес, алғаш сәйкес келген тексеру орындалады. Мың қаралым >= 100-ге де, >= 1000-ға да сай келеді; алдымен жүз тұрса, мыңға кезек жетпейді және «танымал» ешқашан шықпайды. Шарттарды тардан кеңге қарай қояды.
  2. break циклді түгел аяқтайды, орындалу одан кейін жалғасады. continue тек ағымдағы айналымды аяқтайды: дененің қалғаны өткізіліп жіберіледі, бірақ цикл келесі мәннен жалғасады.
  3. Аттар қажет болғаннан ұзақ өмір сүрмеуі үшін. Жоғарғы жолда жарияланса, n мен ok функцияның соңына дейін қалады, бірдеңені солай атауға кедергі келтіреді және оларды әрі қарай пайдалануға болатындай жалған әсер қалдырады. if ішінде олар жабылатын жақшада жоғалады.

Дереккөздер

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Тапсырманы тексеру

Алдымен VS Code-та шешіп, іске қосыңыз — редактор қатені сол жерде көрсетеді. Дайын шешімді осында қойыңыз. Тексеретін — модель: ол қатені атап көрсетеді, бірақ дайын жауапты бермейді.

Тексеру үшін кіру керек. Кіру

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.