Go тілі: нөлден өз блогыңызға дейін 11-сабақ (барлығы 50)
Go-дағы құрылым: бес айнымалының орнына өз тип
Go курсының он бірінші сабағы. Құрылым — өз тип: қолмен үйлестіріп отыратын үш сөздіктің орнына type Article struct. Өрістер мен нүкте, атаулы және атаусыз литерал, нөлдік құрылым, құрылымдар тілімі және басты тұзақ: құрылым көшірмемен беріледі, сондықтан range ішіндегі түзету жоғалады.
Не үшін керек
Өткен сабақтарда блог мақалаларды былай ұстады: мекенжайлар тілімі, тақырыптар сөздігі, көлемдер сөздігі. Мақала қоссаңыз — үш жерді ұмытпау керек. Біреуін ұмытсаңыз, тақырып бар, ал оқу уақыты жоқ.
Былай өмір сүруге болмайды, және Go оны талап та етпейді. Мақалада тақырып, көлем және тіл бар — демек, бәрі бірге жататын «мақала» типі керек.
Елестетіп көріңіз. Картотека. Бұрын бір жәшікте тақырыптар, екіншісінде көлемдер, үшіншісінде тілдер жататын, ал сіз оларды қолмен үйлестіретінсіз. Құрылым — мақала туралы бәрі бірден жазылған бір карточка.
Бірден тұтас
Жаңа қалта, go mod init sabaq10, main.go:
package main
import "fmt"
type Article struct {
Title string
Words int
Lang string
}
func readingTime(a Article) int {
return (a.Words + 199) / 200
}
func main() {
first := Article{
Title: "Шаңырақ деген не",
Words: 400,
Lang: "kz",
}
second := Article{"Дала туралы", 150, "kz"}
var draft Article
fmt.Println(first.Title, "·", readingTime(first), "мин")
fmt.Println(second.Title, "·", readingTime(second), "мин")
fmt.Printf("жоба: %q %d %q\n", draft.Title, draft.Words, draft.Lang)
blog := []Article{first, second}
blog = append(blog, Article{Title: "Сәлем, әлем", Words: 1000, Lang: "kz"})
for i, a := range blog {
fmt.Printf("%d. %s — %d мин\n", i+1, a.Title, readingTime(a))
}
fmt.Println(first)
}
Іске қоспас бұрын — төменге қарамай, оның не басып шығаратынын дауыстап айтыңыз. Содан кейін жіберіп, салыстырыңыз.
Шаңырақ деген не · 2 мин
Дала туралы · 1 мин
жоба: "" 0 ""
1. Шаңырақ деген не — 2 мин
2. Дала туралы — 1 мин
3. Сәлем, әлем — 5 мин
{Шаңырақ деген не 400 kz}
Талдау
type ... struct — өз типіңізді жариялайсыз
type Article struct {
Title string
Words int
Lang string
}
type дейді: әрі қарай жаңа тип. Article — оның аты. struct — неден жасалғаны: аталған өрістерден, әрқайсысының өз аты мен түрі бар.
Осы сәттен бастап Article — int не string сияқты тип. Оны жариялауға, функцияға беруге, тілімге де, сөздікке де салуға болады.
Өріс аттарының бас әріптен басталуы кездейсоқ емес, ал не үшін екені пакеттер сабағында маңызды болады. Әзірге солай жаза беріңіз.
Өрістер мен нүкте
first.Title // оқу
first.Words = 420 // жазу
Нүкте мәннен өрісті алады. Ешқандай жақша мен кілт жоқ: өрістер алдын ала белгілі, ал аттағы қатені компилятор бірден ұстайды — сөздік мұны ешқашан істемейді.
Міне, құрылымның сөздіктен бірінші артықшылығы. views["tittle"] нөл қайтарады да, үндемейді. first.Tittle жиналмайды.
Литерал: өріс аттарымен және онсыз
Article{Title: "Шаңырақ деген не", Words: 400, Lang: "kz"}
Article{"Дала туралы", 150, "kz"}
Екі жазу да бірдей нәрсе жасайды. Біріншісі өрістерді атайды, екіншісі жарияланымдағы реттеріне сүйенеді.
Біріншісін жазыңыз. Екіншісі типке төртінші өріс қосылатын не екеуінің орны ауысатын күнге дейін ғана қысқа — сол кезде мұндай литералы бар кодтың бәрін қайта жазуға тура келеді, ал бір бөлігі үнсіз әрі қате жиналады.
Нөлдік құрылым
var draft Article
"" 0 "" басылды. Құрылым бірден жұмысқа дайын: әр өріс өз түрінің нөлдік мәнін алды — бос жол, нөл, false. Ештеңе жасаудың қажеті жоқ, ешқандай make керек емес.
Елестетіп көріңіз. Бос бланк. Бағандары толтырылмаған, бірақ бланк бар, үстелде жатыр, оған жаза беруге болады.
Бұл көрінгеннен де ыңғайлы. Бос құрылым — қате емес, мақаланың заңды жобасы.
Құрылымдар тілімі — бәрі осы үшін басталған
blog := []Article{first, second}
blog = append(blog, Article{Title: "Сәлем, әлем", Words: 1000, Lang: "kz"})
Үш сөздіктің орнына бір тілім. Мақала бір жолмен қосылады, ал өрістерінің жартысын жоғалту енді мүмкін емес: олар бірге көшті.
Тұзақ: құрылым көшірмемен беріледі
Сабақты соңына дейін оқуға тұратын нәрсе осы.
for _, a := range blog {
a.Title = "ӨЗГЕРДІ"
}
fmt.Println(blog[0].Title) // Шаңырақ деген не
Ештеңе өзгерген жоқ. range a ішіне элементтің көшірмесін салады, ал сіз сол көшірмені түзетесіз де, ол сол сәтте лақтырылады. Компилятор үндемейді: оның тұрғысынан код заңды.
Функциямен де солай: readingTime(a) көшірме алады, және егер ол ішінде бірдеңе өзгертсе, сырттан оны көрмес едіңіз.
Елестетіп көріңіз. Ксерокөшірме. Сізге құжаттың көшірмесін берді — оған қалағаныңызша жаза беріңіз, тігіндіде бұрынғысы қалады.
Шынымен өзгерту қалай — индекс арқылы:
blog[0].Title = "ӨЗГЕРДІ" // мінеки, бұл жұмыс істейді
Тілім сабағымен салыстырыңыз: онда тілімнен кесілген тілім сол жадының өзіне қарайтын, түзету көрінетін. Мұнда басқаша: тілімнің өзі бір болып қала береді, бірақ range сізге элементтің көшірмесін береді, элементтің өзін емес. Нағыз шешім — сілтегіштер, ол келесі сабақ.
fmt.Println құрылымды тұтас басады
fmt.Println(first) {Шаңырақ деген не 400 kz} деп басты — фигуралық жақшадағы өріс мәндері. Жөндеуге ыңғайлы, ал %+v арқылы өріс аттары да шығады: fmt.Printf("%+v\n", first).
Сабақ картасы
Өз сөзіңізбен айтыңыз
Қарамай, дауыстап немесе қағазға жазып жауап беріңіз. Жауаптары — сабақтың соңында.
- Екі жағдайда да қате терілсе,
first.Tittleviews["tittle"]-дан несімен жақсы? var draft Article— өрістерде не жатыр және бірдеңе жасау керек пе?- Құрылымдар тілімін
rangeарқылы аралап, өріске жаздыңыз. Тілімде неге ештеңе өзгермеді?
Тапсырма
Міндетті. Title, Words және Lang өрістері бар Article типін жариялаңыз. Төрт мақаладан тілім жинап, longestRead(blog []Article) Article функциясын жазыңыз — оқу уақыты ең ұзақ мақаланы қайтарады. Оның тақырыбы мен уақытын басып шығарыңыз.
Қалауыңызша.
byLang(blog []Article, lang string) []Articleфункциясы — тек керек тілдегі мақалалар.- Типке
Published boolөрісін қосып, қанша мақала жарияланғанын санаңыз. - Тұзақты әдейі қайталаңыз:
rangeішінде өрісті өзгертіп, ештеңе болмағанына көз жеткізіңіз, содан кейін сол істі индекс арқылы жасаңыз.
Блогта қайда тұрады
Осы жерден бастап курстың соңына дейін мақала құрылым болады. Шаблон сабағында []Article-ды HTML-ге бересіз де, ол карточкаларға жайылады. Дерекқор сабағында кестенің жолы бір пәрменмен Article-ға айналады. Ал қолмен үйлестіріп отырған үш сөздік жоғалады — курс репозиторийіндегі step-5 дәл осы туралы.
Жауаптар
Жауаптарды көрсету
first.Tittleжиналмайтынымен: типтің өрістері компиляторға белгілі, ол қатені іске қосудан бұрын ұстайды. Сөздік кез келген кілтті қабылдайды, сондықтанviews["tittle"]үнсіз нөл қайтарады, ал қатені хабардан емес, дұрыс емес сандардан табасыз.- Өрістерде түрлерінің нөлдік мәндері: бос жол, нөл,
false. Ештеңе жасаудың қажеті жоқ — сөздіктен айырмашылығы, құрылым жарияланған бойда жұмысқа дайын. - Себебі
rangeайнымалыға элементтің көшірмесін салады. Сіз көшірмені өзгерттіңіз, ал ол келесі айналымда жоғалды. Элементтің өзін индекс арқылы өзгертуге болады —blog[i].Title = …, — ал бұл айырманы шын мәнінде келесі сабақ, сілтегіштер туралы сабақ жабады.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.