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 циклі бұлай құлай алмайды: ол шақыруларды жинамайды.
Елестетіп көріңіз. Матрёшка. Оны ашасыз, ішінде дәл сондай кішірегі, солай ең кішісіне дейін — ол енді ашылмайды. Кішісі болмаса, шексіз ашып отырар едіңіз.
Оны цикл орнына қашан таңдайды: дерек өз-өзіне ұя салып тұрғанда. Пікірге жазылған пікір, қалта ішіндегі қалта, жауапқа берілген жауап — мұндайды циклмен айналып өту қиын, ал рекурсиямен табиғи. Жазық тізім үшін цикл қарапайым әрі жылдам, сондықтан бұл курста барлық жерде дерлік цикл болады.
Сабақ картасы
Өз сөзіңізбен айтыңыз
Қарамай, дауыстап немесе қағазға жазып жауап беріңіз. Жауаптары — сабақтың соңында.
labelішінде тексерулердің ретін неге ауыстыруға болмайды?breakпенcontinueайырмашылығы неде?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 қайтару, өңдеуге жіберу немесе бас тарту, «пікір жоқ» деп жазу немесе тізім шығару. Ал цикл мақала біреуден көбейген бойда керек болады — тілімдер туралы сабақта олардың бәрін бір жолмен аралайсыз.
Жауаптар
Жауаптарды көрсету
- Себебі ең дәл емес, алғаш сәйкес келген тексеру орындалады. Мың қаралым
>= 100-ге де,>= 1000-ға да сай келеді; алдымен жүз тұрса, мыңға кезек жетпейді және «танымал» ешқашан шықпайды. Шарттарды тардан кеңге қарай қояды. breakциклді түгел аяқтайды, орындалу одан кейін жалғасады.continueтек ағымдағы айналымды аяқтайды: дененің қалғаны өткізіліп жіберіледі, бірақ цикл келесі мәннен жалғасады.- Аттар қажет болғаннан ұзақ өмір сүрмеуі үшін. Жоғарғы жолда жарияланса,
nменokфункцияның соңына дейін қалады, бірдеңені солай атауға кедергі келтіреді және оларды әрі қарай пайдалануға болатындай жалған әсер қалдырады.ifішінде олар жабылатын жақшада жоғалады.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.