Go тілі: нөлден өз блогыңызға дейін
Елу сабақ, оның үстіне анонс пен алғысөз. Соңында өз блогыңыз интернетте, өз доменіңізде жұмыс істейді. Барлық сабақ ашық: тегін және тіркелусіз.
·
Барлық сабақ ашық: оқу үшін тіркелудің қажеті жоқ.
-
Қазақша тегін бағдарламалау курсы: Go нөлден бастап
50 сабақтан тұратын курс: «интернет қалай жұмыс істейді» дегеннен өз доменіңізде тұратын Go-дағы жеке блогқа дейін. Курс толық жазылған, оқу үшін тіркелудің де, төлемнің де қажеті жоқ. Қазақша бірінші, орысша мен ағылшынша қатар. Ішінде: соңында не шығады, неге Go әрі онымен кім жазады.
-
Бастар алдында: курсқа не керек, не керек емес
Go курсына кіріспе. Шын мәнінде не керек — компьютер, бағдарлама орнату құқығы және күніне жарты сағат, — және не керек емес: ағылшын тілі, математика, қуатты машина. Терминалыңыз қайсы және неге бұл маңызды, орнатуға тыйым салынса не істеу керек, бәрі қанша тұрады.
-
Интернет қалай жұмыс істейді: HTTP сұранысы, 15 минут
Go курсының бірінші сабағы. Браузер серверден нені сұрайды және не нәрсе жауап саналады: клиент пен сервер, домен, IP және порт, әдіс пен жол, тақырыптар, 200, 404, 500 кодтары. Терминалдағы бір жол нағыз HTTP жауабын оқымай тұрып көрсетеді. Мектеп бағдарламасы мұны бермейді.
-
Go орнату және VS Code баптау: жұмыс ортасы нөлден
Go курсының екінші сабағы. Кодтың бірінші жолына дейін не керек: Go 1.27, Go кеңейтімі бар VS Code, жоба қалтасы және go mod init. Қайсысы не үшін жауап беретінін талдаймыз: тіл, редактор, кеңейтім және терминал. Соңында алғашқы бағдарламаңыз терминалда әлемге сәлем айтады.
-
Go-дағы алғашқы бағдарлама: net/http сервері, 20 минут
Go курсының үшінші сабағы. Go-дағы алғашқы бағдарлама және жұмыс істейтін веб-сервер: package main, func main, http.HandleFunc, http.ListenAndServe және 8080 порты. Тілдің бірде-бір ережесін жаттамай тұрып, браузерден өз бағдарламаңыздың жауабын көресіз. Порт бос болмаса, не істеу керек.
-
Go-дағы айнымалылар мен типтер: string, int, float64, bool
Go курсының төртінші сабағы. Айнымалы деген не және тілге типтер не үшін керек: string, int, float64 және bool, := мен var арқылы жариялау, нөлдік мәндер және тип неге бір рет таңдалады. Бірінші күні кездесетін declared and not used қатесін және атау ережелерін талдаймыз.
-
Go-дағы функциялар: параметрлер, return және екі мән
Go курсының бесінші сабағы. Функцияны қалай жариялау керек және параметр, аргумент, return деген не. Сабақтың ең бастысы: Go-да функция бірден екі мән қайтарады — нәтиже және шықты ма деген белгі. Тілде ерекше жағдайлардың жоқтығы содан. result, ok := тәсілін талдаймыз.
-
Go-дағы тармақталу мен цикл: if, else және жалғыз for
Go курсының алтыншы сабағы. Бағдарлама екі жолдың бірін қалай таңдайды: if, else if және else, салыстырулар мен ЖӘНЕ, НЕМЕСЕ, ЕМЕС. Ал цикл Go-да дәл біреу — for сөзі, бірақ үш пішінде: санауышпен, шарт бойынша және шартсыз, break арқылы. Тілде while де, foreach те жоқ.
-
Go-дағы жолдар мен руналар: қазақ әрпі неге екі байт
Go курсының жетінші сабағы. len("шаңырақ") неге 7 емес, 14 қайтарады, байт пен әріптің айырмашылығы неде және руна деген не. Жолды range арқылы аралау, әріпті utf8.RuneCountInString арқылы дұрыс санау және басты тұзақ: жолды байтпен қиғанда қазақ әрпі қақ жарылады.
-
Go-дағы жиым мен тілім (slice): өсетін тізім, append, len және cap
Go курсының сегізінші сабағы. Тілім неден жасалған — жиым, әрі тілімнің өзі: []string, append және нәтижені неге кері меншіктеу керек. Меншіктегенде жиым мен тілім несімен ерекшеленеді, ұзындық пен сыйымдылық несімен, әрі басты тұзақ: кесілген бөлік сол бір жадты пайдаланады.
-
Go-дағы сөздік (map): кілт пен мән
Go курсының тоғызыншы сабағы. Сөздік, ағылшынша map: «кілт — мән» жұбы, ол тізімді теріп шығуды емес, бірден табуды береді. Жазу мен оқу, жоқ кілт неге қате емес, нөл беретіні, үтір-ok деген не, Go аралау ретін неге өзгертеді және nil-сөздік nil-тілімнен несімен қауіпті.
-
Go-дағы алғашқы тест: go test және _test.go файлы
Go курсының оныншы сабағы. Жазылып қалатын тексеру: код қасындағы _test.go файлы, TestXxx функциясы және go test пәрмені. Құлауды қалай оқу керек — тест аты, файл, жол, «алдық» пен «күттік», — t.Errorf пен t.Fatalf айырмасы және неге тізімнің ортасын емес, шетін тексереді.
-
Go-дағы құрылым: бес айнымалының орнына өз тип
Go курсының он бірінші сабағы. Құрылым — өз тип: қолмен үйлестіріп отыратын үш сөздіктің орнына type Article struct. Өрістер мен нүкте, атаулы және атаусыз литерал, нөлдік құрылым, құрылымдар тілімі және басты тұзақ: құрылым көшірмемен беріледі, сондықтан range ішіндегі түзету жоғалады.
-
Go-дағы сілтегіштер мен әдістер: түзету неге сақталмаған
Go курсының он екінші сабағы. Өткен сабақтағы тұзақтың жауабы: сілтегіш — мәннің көшірмесі емес, мекенжайы. & мен * қалай жұмыс істейді, әдістің функциядан айырмашылығы, қабылдағышты қашан сілтегіш, қашан мән алады, және for i := range неге for _, a := range бұзғанды түзетеді.
-
Go-дағы интерфейс: құрылысы емес, білігі бойынша келісім
Go курсының он үшінші сабағы. Интерфейс — біліктер тізімі: бір функция кез келген қоймамен жұмыс істейді, тек ол келісімде жазылғанды білсе болды. Іске асыру неге жарияланбай, өзінен-өзі шығады, оны жинау кезінде қалай тексереді және алмастырма қойма тестті дерекқорсыз неге мүмкін етеді.
-
Go-дағы қателер: ерекше жағдай емес, кәдімгі мән
Go курсының он төртінші сабағы. Мұнда қате бағдарламаны үзбейді, екінші мән болып қайтады, ал тексерілуі бірінші. error — бір ғана әдісі бар интерфейс, errors.New мен fmt.Errorf, %w арқылы орау және errors.Is, өз қатеңізді мән ретінде жариялау — және мұның бәріне panic неге керек емес.
-
Go-дағы пакеттер мен модульдер: go mod және бас әріп
Go курсының он бесінші сабағы. Пакет — бұл қалта, ал аттағы бас әріп — сыртқа ашылатын есік. Бағдарламаны қалталарға қалай бөледі, go.mod пен go.sum ішінде не жазылған, бөтен пакетті go get арқылы қалай қосады және go mod tidy-ды неге код жіберер алдында орындайды.
-
Git: кодыңыздың тарихы және кері жол
Go курсының он алтыншы сабағы. Git файлдың соңғы нұсқасын емес, қайта оралуға болатын барлық күйді сақтайды. git init, үш орын — жұмыс қалтасы, индекс және тарих, — ең жиі қолданылатын пәрмен git status, жазба хабарына не жазады, .gitignore не үшін керек және кешегі файлды кері қалай алады.
-
GitHub: көрінетін код
Go курсының он жетінші сабағы. GitHub — сақтық көшірме емес, басқаларға көрінетін сол тарихтың өзі. Аккаунт және алғашқы репозиторий, git remote мен git push, ондағы құпиясөзді неге қабылдамайды және оның орнына не келді, README — адам ең алдымен оқитын нәрсе, және ешқашан жарияламайтын дүниелер.
-
Жинақтау: білетініңіздің бәрінен консольдегі жазба кітапшасы
Go курсының он сегізінші сабағы және тіл туралы модульдің соңы. Таныс бөлшектерден құралған бір аяқталған бағдарлама: құрылым, тілім, сөздік, сілтегішті әдістер, қателер, өз пакеті және тестер. Пернетақтадан пәрмен оқудан басқа жаңа ештеңе жоқ: үйренгенді жинау — бөлек шеберлік.
-
HTTP шындығында: әдіс, жол, тақырыптар және жауап коды
Go курсының он тоғызыншы сабағы және веб туралы модульдің басы. Сұраныс — оқуға болатын құрылым: әдіс, жол, тақырыптар, параметрлер. Жауап бір бағытта кетеді: тақырыптар, код, дене — дәл осы ретпен. 404 пен 405 неге екі бөлек жауап және superfluous WriteHeader деген хабар нені білдіреді.
-
Go-дағы бағыттар: қай мекенжайды кім өңдейді
Go курсының жиырмасыншы сабағы. ServeMux сұраныстарды өңдеушілерге бөледі: әдіс пен жол бір жолға жазылады, {slug} мекенжайдың бөлігін алады, {$} басты бетке бәрін ұстауға жол бермейді. 404 пен 405-ті бағыттауыш өзі береді, ал екі бағыттың қақтығысын іске қосқанда ұстайды.
-
Өңдеуші және middleware: барлық бағытқа бір орама
Go курсының жиырма бірінші сабағы. Бағыттауыштың айналасындағы орама әр сұраныс үшін бірдей істі істейді: журнал, жауап уақыты, тексеру. http.Handler деген не, орама неге өңдеушіні алып, өңдеуші қайтарады және ResponseWriter сақтамайтын жауап кодын қалай білуге болады.
-
Go-дағы үлгілер: html/template және жол емес, бет
Go курсының жиырма екінші сабағы. HTML кодтан бөлек файлға көшеді: нүкте — деректің аты, тілім бойынша range, if пен else. html/template бөтен мәтінді неге өзі залалсыздандырады, үлгілерді неге іске қосылғанда бір рет талдайды және бетті неге бірден жауапқа емес, буферге жинайды.
-
Go-дағы форма (form): оқырман жіберген дерек
Go курсының жиырма үшінші сабағы. Дерек алғаш рет кері бағытта жүреді — оқырманнан серверге. Әдіс пен өріс аттары, r.FormValue, браузердегі тексеру неге қорғаныс емес және бірдеңені өзгерткен өңдеуші неге бет емес, бағыттау қайтарады: әйтпесе F5 дәл сондай екінші мақала жасайды.
-
Go-дағы статика: CSS, қаріп және сурет
Go курсының жиырма төртінші сабағы. Сайт жұмыс істеп қана қоймай, көріне бастайды. http.FileServerFS, StripPrefix дискіге неге керек, кірістірілгенге неге керек емес, Content-Type қайдан шығады, static қалтасы неге түгел көрінеді және кірістірілген файлды браузер неге қайта жүктейді.
-
Go-дағы қате мен журнал: не бұзылғанын көру
Go курсының жиырма бесінші сабағы. Өңдеушідегі паника серверді емес, жауапты құлатады, ал оқырман мүлде ештеңе алмайды. Бір аралық қабаттағы recover, беттегі және журналдағы өтініш нөмірі, консольге басудың орнына log/slog және жауап кетіп үлгерсе құтқарудың неге кеш екені.
-
Go-дағы баптау: флагтар, орта айнымалылары және кодтан тыс құпия сөз
Go курсының жиырма алтыншы сабағы. Мекенжай, дерекқор файлы және қолтаңба кілті кодтан кетеді. flag пакеті мен -h беретін анықтама, орта айнымалысын флагтың әдепкі мәні ету, бос айнымалының берілмегеннен несімен өзгешелігі және міндетті баптау болмаса неге іске қосылғанда құлау керек.
-
SQL: алғашқы кесте, INSERT және SELECT
Go курсының жиырма жетінші сабағы. Мақалалар ақыры қайта қосудан аман қалады. Курста неге Postgres емес, SQLite, кестені қалай жасап, оған жолды қалай салу керек: RETURNING-пен insert, WHERE мен ORDER BY-мен select, WHERE ұмытылған update және = null мен is null айырмасы.
-
SQL: екі кесте, JOIN және сыртқы кілттер
Go курсының жиырма сегізінші сабағы. Мақалаға пікірлер келеді, ал олар оның ішіне сыймайды. Екінші кесте және олардың арасындағы кілт, join мен left join, каскадты өшіру және сыртқы кілттерді үнсіз қалдырып, жолдарды жетім ететін SQLite тұзағы.
-
SQLite және database/sql: тілімнен емес, дерекқордан алынған алғашқы жол
Go курсының жиырма тоғызыншы сабағы. Блог ақыры мақалаларды дерекқор файлынан оқиды. Пакет пен драйвер, sql.Open неге ештеңе ашпайды, қосылымдар пулы деген не және сыртқы кілттер туралы прагманы неге бөлек сұраныс емес, қосылу жолына жазады. Сонымен қатар ErrNoRows және циклден кейінгі тексеру.
-
CRUD: мақала үстіндегі төрт әрекет және тілімсіз өмір
Go курсының отызыншы сабағы. Мақалалар тілімнен дерекқорға көшеді әрі қайта қосудан аман қалады. Дерекқорды қалған кодтан жасыратын Store типі, мақала үстіндегі төрт әрекет және бөлімге тұрарлық бір нәрсе: жоқ нәрсені жаңарту — қате емес, оны тек RowsAffected айтады.
-
Көші-қон: дерекқор тарихы, `create table if not exists` емес
Go курсының отыз бірінші сабағы. Схеманы енді бағдарлама қосылғанда жасамайды: нөмірленген көші-қон файлдары, журнал және «бір рет» ережесі пайда болады. Оның үстіне өлшенген тұзақ: default-сыз not null бағанын бос дерекқор қабылдайды, жұмыстағысы қабылдамайды.
-
Транзакция және SQL-инъекция: сұраныс — жабыстырылатын жол емес
Go курсының отыз екінші сабағы. Дерекқорды бүтін ұстайтын екі ереже. Дерек сұраныс мәтініне жабыстырылмайды: қолдан жасалған мекенжай бір емес, үш жол қайтарады, ал параметр арқылы — нөл. Бірге болуға тиіс нәрсе транзакцияға оралады: онсыз санауыш болмаған көшу үшін өсіп кеткен.
-
Тег: беттен көрінбейтін үшінші кесте
Go курсының отыз үшінші сабағы. Мақалада тег көп, тегте мақала көп — әрі бұл бағандағы тізім емес, бөлек кесте болып сақталады. Құрама кілт, id үшін on conflict, өшіргендегі каскад. Әрі уәде етілген нәрсе: қатенің мәтінін оқымай, кодын сұрау жолы.
-
Іздеу: FTS5 және параметр неден құтқармайды
Go курсының отыз төртінші сабағы. Блогта жұмыс істейтін іздеу: FTS5 виртуалды кестесі, үш триггер, реттеу және табылғанды бояу. Әрі өлшенген тосын жайт: параметр инъекциядан қорғайды, бірақ адам іздеу жолағына OR деп терсе — қорғамайды.
-
Макет: барлық бетке бір жақтау
Go курсының отыз бесінші сабағы. Блогтың жеті үлгісі беттің бір басталуының жеті көшірмесін ұстап отыр. Бүгін бір жақтау қалады: блоктары бар base, pages пен partials қалталары, семантикалық белгілеу — әрі өлшенген тұзақ, соның кесірінен адамдарда барлық бет кенет біреуін көрсетеді.
-
Тіркелу: құпиясөздің орнына не сақтайды
Go курсының отыз алтыншы сабағы. Құпиясөз дерекқорда сақталмайды — тұзы ішінде, құны сыртында тұрған bcrypt хеші сақталады. Өлшенді: sha256 секундына тоғыз миллион хеш береді, bcrypt оны. Оның үстіне 72 байт шегі, оған қазақ құпиясөзі отыз жетінші әріпте-ақ тіреледі.
-
Сессия мен cookie: сервер кімнің кіргенін қалай есте сақтайды
Go курсының отыз жетінші сабағы. HTTP ештеңе есте сақтамайды: әр сұраныс бейтаныс адамнан келеді. Пайдаланушы нөмірі жазылған cookie бір секундта қолдан жасалады. Сондықтан браузерге кездейсоқ токен, дерекқорға оның хеші кетеді, ал бәрін үш сөз жабады: HttpOnly, Secure, SameSite.
-
Құқық: кім нені өзгерте алады
Go курсының отыз сегізінші сабағы. Батырманы жасыру — қорғаныс емес: бөтен адам батырманы көрмей тұрып, тікелей сұраныспен мақалаңызды қалай түзететіні өлшенді. Тексеру өңдеушіде әрі бір жерде тұрады, ал бас тартулар әртүрлі: қонақты кіруге, бөтенге 403, жоғына 404.
-
CSRF пен XSS: бәріне қойылатын үш қорғаныс
Go курсының отыз тоғызыншы сабағы. Бетіңіздегі бөтен скрипт және оқырманыңыздың атынан форма жіберетін бөтен сайт. html/template-тің орнына қарай — мәтінде, сілтемеде және script ішінде — қалай экрандайтыны және жетонның сіздің формаңызды бөтеннен қалай ажырататыны өлшенді.
-
Сурет жүктеу: дискідегі бөтен файл
Go курсының қырқыншы сабағы. Ішінде файл жүретін форма және файл дискіге жатпай тұрып тексерілетін төрт нәрсе: өлшемі, мазмұны бойынша түрі, жіберілгеннің орнына өз аты және оны қоятын орын. Қоса /static-ты ретке келтіреміз: brand, css, images, js, uploads.
-
Тест: түзеткенде не сынғанын білу
Go курсының қырық бірінші сабағы. 10-сабақта уәде етілген кесте: жағдайлар тізімге салынады, t.Run әрқайсысына ат береді, ал құлау қай жағдай сынғанын бірден айтады. Оның үстіне өңдеушіні сервер көтермей тексеру және -cover не көрсететіні туралы адал әңгіме.
-
Горутина мен арна: вебке не үшін керек
Go курсының қырық екінші сабағы. Сервер HTTP сабағынан бері конкурентті, әрі мұны сіз таңдаған жоқсыз: әр сұраныс — өз горутинасы. Құлыпсыз санауыш алдымен бес жүзден бір оқылымды жоғалтатыны, сосын бүкіл серверді құлататыны және go test -race мұны алдын ала табатыны өлшенді.
-
`context`: сұранысты уақытында тоқтату
Go курсының қырық үшінші сабағы. Оқырман қойындыны жапты — өңдеуші мұны өзі біледі: екі жүз миллисекундтан кейін жұмысты тастайтыны өлшенді. Дерекқорға берілген мерзім, жолдың орнына өз типіндегі кілт және кірген адамның сұраныс контекстіне уәде етілген көшуі.
-
JSON және өз API-іңіз: блогты тек браузермен оқымайды
Go курсының қырық төртінші сабағы. Құрылым тегтері өрістің сырттағы атын және мүлде жасырылатынын шешеді; бөтен JSON-дағы артық өріс сұрамасаңыз үндемейді; типсіз сан float64-ке айналады. Әрі қатесі де JSON болатын өңдеуші жауабы.
-
Өз логотипіңіз, өз атыңыз, өз белгішеңіз: блог сіздікі болады
Go курсының қырық бесінші сабағы. Блог бөтен ат, бөтен белгі әрі бөтен түс тағып жүр — осы сабаққа дейін. Ат он бір үлгіден бір баптауға көшеді, логотип сіздің файлыңыз болады, палитра — тоғыз жол, ал белгіше сіздікі. Қоса контраст саналып, екі қатеміз түзетілді. SVG — 193 байт.
-
Блогты адамдарға жеткізу: тегін хостинг
Go курсының қырық алтыншы сабағы. Хостинг сіз үшін үш нәрсені шешеді: порт PORT айнымалысында келеді, машинаның барлық мекенжайын тыңдау керек, ал тегін тарифтің дискі әр деплойда жоғалады — өлшенді: сол құпиясөзбен кіру бұрын 303, кейін 401. Әрі бір статикалық файлға жинау.
-
Өз доменің және HTTPS: блогты атпен ашсын
Go курсының қырық жетінші сабағы. Домен — сіздің мекенжайыңызға апаратын DNS-тегі бір жазба, ал HTTPS — құсбелгі емес, қажеттілік: ашық арнада оқырманның құпиясөзі толық көрінетіні өлшенді, барлық 222 байт, ал TLS-те ол байттарда жоқ. Қоса алдыңғы прокси әрі сенуге болмайтын тақырып.
-
Қайта жүктеуден аман өтетін қызмет: systemd және ұқыпты тоқтау
Go курсының қырық сегізінші сабағы. Бағдарламаны түймемен емес, сигналмен тоқтатады, әрі айырмашылық өлшенді: үзілісте оқырман EOF алады, ұқыпты тоқтауда — 270 мс өткенде 200 жауабы. Қоса нағыз systemd тексерген қызмет файлы, қайта жүктеуден кейінгі автоқосылу әрі жабу реті.
-
Іске қосар алдында: үміт емес, тексеру парағы
Go курсының қырық тоғызыншы сабағы. Таймаутсыз сервер қосылымды шексіз ұстайды — өлшенді: баяу клиент оны бос емес қылды, ал бірінші болып біз бас тарттық. Қоса жұмыс істеп тұрған блогтан алынған дерекқор көшірмесі, іздеуге арналған сипаттама әрі он үш тармақ.
-
Әрі қарай қайда: дженериктер және курстан кейінгі жол
Go курсының елуінші, соңғы сабағы. Дженериктер — үшеудің орнына бір функция, ал типке қойылған шартты компилятор тексереді: `string` іске қосылғанға дейін өтпейтіні өлшенді. Олардың `any`-ден несімен жақсы екені де өлшенді: 534 наносекунд пен 1801.