Алгоритмсозӣ ва барномасозӣ дар забони Go

Китоби таълимии забони Go барои мактабиён, донишҷӯён ва омӯзгорон: аз алгоритм ва блок-схемаҳо то веб-сервер ва боти Телеграм. Таҷдиди китоби А. П. Назаров «Алгоритмсозӣ ва барномасозӣ дар забони Бейсик» (2009).
Агенти Зеҳнӣ · 26 октябри 2026 · 15 саҳифа
Боби 10. Сохторҳо (`struct`) ва харитаҳо (`map`)
Боби 10. Сохторҳо (struct) ва харитаҳо (map)
Дар ҳаёти воқеӣ маълумот танҳо аз як адади алоҳида ё як сатр иборат нест. Масалан, «Хонанда» дорои ном, насаб, синну сол ва баҳоҳо мебошад. Ё «Нуқта дар ҳамворӣ» дорои ду координатаи X ва Y аст. Барои муттаҳид кардани ин гуна маълумоти алоқаманд дар забони Go сохтори махсусе бо номи struct (сохтор) истифода мешавад. Ҳамчунин, барои ҷустуҷӯи зуди маълумот аз рӯи калидҳо (масалан, ёфтани рақами телефон аз рӯи номи шахс) map (харита) хизмат мекунад. Дар ин боб шумо тарзи истифодаи ин ду абзори муҳимро меомӯзед.
Дар ин боб меомӯзем
- Сохтор (
struct) чист ва чӣ тавр навъи додаи худро месозем. - Эҷод ва пур кардани майдонҳои сохтор.
- Пайваст кардани методҳо (methods) ба сохторҳо.
- Фарқи қабулкунандаи қиматӣ ва қабулкунандаи нишондиҳандагӣ (pointer receiver).
- Харитаҳо (
map) дар Go: нигоҳдории ҷуфтҳои «калид — қимат». - Санҷиши мавҷудияти калид дар харита бо шакли «қимат, ok».
- Моделсозии масъалаҳои воқеии геометрӣ ва оморӣ бо сохторҳо.
Сохтор (struct) чист?
Сохтор (struct) маҷмӯи майдонҳои номдор аст. Майдонҳо метавонанд навъҳои якхела ё гуногун дошта бошанд.
Дар забони Go барои эълони сохтори нав калимаҳои type ва struct истифода мешаванд.
Масалан, биёед сохтори Нуқта дар ҳамворӣ-ро эълон кунем:
type Nuqta struct {
X float64
Y float64
}
Ё сохтори Хонанда-ро:
type Xonanda struct {
Nom string
Sinf int
BallMiyona float64
}
Тарзи эҷоди объекти сохтор ва истифодаи он
Барои сохтани намунаи сохтор ва пур кардани майдонҳои он:
package main
import "fmt"
type Nuqta struct {
X float64
Y float64
}
func main() {
// Тарзи 1: Бо зикри номи майдонҳо
p1 := Nuqta{X: 3.0, Y: 4.0}
// Тарзи 2: Кӯтоҳ (бо тартиби майдонҳо)
p2 := Nuqta{6.0, 8.0}
// Муроҷиат ба майдонҳо бо ёрии аломати нуқта (.)
fmt.Printf("Нуқтаи 1: X = %.1f, Y = %.1f\n", p1.X, p1.Y)
fmt.Printf("Нуқтаи 2: X = %.1f, Y = %.1f\n", p2.X, p2.Y)
// Тағйир додани қимати майдон
p1.X = 10.5
fmt.Println("Нуқтаи 1 пас аз тағйир:", p1)
}
Натиҷа:
Нуқтаи 1: X = 3.0, Y = 4.0
Нуқтаи 2: X = 6.0, Y = 8.0
Нуқтаи 1 пас аз тағйир: {10.5 4}
Диққат: Ҳангоми бахшидан (
p3 := p1) ё супоридан ба функсия сохтор пурра нусхабардорӣ мешавад. Тағйир доданиp3.Xбаp1.Xҳеҷ таъсир намерасонад — ҳамон тавре ки дар боби 9 дар бораи интиқоли додаҳо бо қимат гуфта шуда буд.
Методҳо дар Go
Дар забони Go синфҳо (classes) мисли Java ё C++ вуҷуд надоранд. Ба ҷойи ин, Go ба мо имкон медиҳад, ки функсияҳоро бевосита ба сохторҳо «пайваст» намоем. Чунин функсияҳо метод (method) номида мешаванд.
Метод қабулкунанда (receiver)-и худро дорад, ки пеш аз номи функсия дар қавс навишта мешавад:
package main
import (
"fmt"
"math"
)
type Nuqta struct {
X float64
Y float64
}
// Метод барои ҳисоби масофа аз нуқта то ибтидои координатаҳо (0, 0)
func (n Nuqta) MasofaToMarkaz() float64 {
return math.Sqrt(n.X*n.X + n.Y*n.Y)
}
func main() {
p := Nuqta{X: 3.0, Y: 4.0}
// Метод ба воситаи нуқта даъват мешавад:
fmt.Printf("Масофа то марказ: %.2f\n", p.MasofaToMarkaz()) // 5.00
}
Қабулкунандаи қиматӣ ва қабулкунандаи нишондиҳандагӣ
Дар методи боло қабулкунанда (n Nuqta) — қиматӣ аст: метод нусхаи нуқтаро мегирад. Барои хондан ва ҳисоб кардан ин комилан кифоя аст. Аммо агар метод бояд майдонҳои худи сохторро тағйир диҳад, нусха ба кор намеояд — тағйирот танҳо дар нусха боқӣ мемонад ва пас аз анҷоми метод гум мешавад.
Дар боби 9 шумо бо нишондиҳандаҳо (pointers, *T ва &x) шинос шудед. Барои тағйир додани сохтор қабулкунандаро нишондиҳанда эълон мекунем — (n *Nuqta):
package main
import "fmt"
type Nuqta struct {
X, Y float64
}
// Қабулкунандаи қиматӣ: метод бо НУСХА кор мекунад
func (n Nuqta) KuchondaniNusxa(dx, dy float64) {
n.X += dx
n.Y += dy
}
// Қабулкунандаи нишондиҳандагӣ: метод худи сохторро тағйир медиҳад
func (n *Nuqta) Kuchondan(dx, dy float64) {
n.X += dx
n.Y += dy
}
func main() {
p := Nuqta{X: 1, Y: 1}
p.KuchondaniNusxa(5, 5)
fmt.Println("Пас аз KuchondaniNusxa:", p) // {1 1} — тағйир наёфт
p.Kuchondan(5, 5) // Go худаш (&p).Kuchondan(5, 5)-ро даъват мекунад
fmt.Println("Пас аз Kuchondan: ", p) // {6 6}
}
Натиҷа:
Пас аз KuchondaniNusxa: {1 1}
Пас аз Kuchondan: {6 6}
Қоидаи амалӣ:
- Агар метод сохторро тағйир диҳад ё сохтор хеле калон бошад — қабулкунандаи нишондиҳандагӣ (
*T). - Агар метод танҳо хонад ва сохтор хурд бошад — қабулкунандаи қиматӣ (
T) кифоя аст. - Беҳтар аст, ки ҳамаи методҳои як навъ як хел қабулкунанда дошта бошанд.
Моделсозии фигураи геометрӣ: Секунҷа
Биёед бубинем, ки чӣ тавр сохторҳо кори моро бо масъалаҳои геометрӣ сода мекунанд:
package main
import (
"fmt"
"math"
)
type Nuqta struct {
X, Y float64
}
type Sekunja struct {
A, B, C Nuqta
}
// Функсияи ёрирасон барои масофаи байни ду нуқта
func masofa(p1, p2 Nuqta) float64 {
dx := p1.X - p2.X
dy := p1.Y - p2.Y
return math.Sqrt(dx*dx + dy*dy)
}
// Методи Sekunja барои ҳисоби периметр
func (s Sekunja) Perimetr() float64 {
ab := masofa(s.A, s.B)
bc := masofa(s.B, s.C)
ca := masofa(s.C, s.A)
return ab + bc + ca
}
func main() {
t := Sekunja{
A: Nuqta{0, 0},
B: Nuqta{4, 0},
C: Nuqta{0, 3},
}
fmt.Printf("Периметри секунҷа: %.2f\n", t.Perimetr()) // 12.00
}
Моделсозии оморӣ: Буриши сохторҳо
Якҷоя истифода бурдани сохторҳо ва буришҳо (боби 7) кор бо маҷмӯи додаҳоро осон мекунад. Масалан, рӯйхати хонандагонро ҳамчун []Xonanda нигоҳ дошта, баҳои миёнаро ҳисоб мекунем, хонандаи дорои баҳои баландтаринро меёбем ва шумораи аълохонҳоро мешуморем:
package main
import "fmt"
type Xonanda struct {
Nom string
Sinf int
BallMiyona float64
}
func main() {
sinf := []Xonanda{
{Nom: "Алишер", Sinf: 10, BallMiyona: 4.8},
{Nom: "Мадина", Sinf: 10, BallMiyona: 5.0},
{Nom: "Рустам", Sinf: 10, BallMiyona: 4.2},
{Nom: "Нигина", Sinf: 10, BallMiyona: 3.9},
}
jam := 0.0
behtarin := sinf[0]
alochiyon := 0
for _, x := range sinf {
jam += x.BallMiyona
if x.BallMiyona > behtarin.BallMiyona {
behtarin = x
}
if x.BallMiyona >= 4.5 {
alochiyon++
}
}
miyona := jam / float64(len(sinf))
fmt.Printf("Балли миёнаи синф: %.2f\n", miyona)
fmt.Printf("Беҳтарин хонанда: %s (%.1f)\n", behtarin.Nom, behtarin.BallMiyona)
fmt.Printf("Шумораи аълохонҳо (≥ 4.5): %d\n", alochiyon)
}
Натиҷа:
Балли миёнаи синф: 4.47
Беҳтарин хонанда: Мадина (5.0)
Шумораи аълохонҳо (≥ 4.5): 2
Харитаҳо (map): Ҷуфти калид ва қимат
Харита (map ё луғат) — ин сохторест, ки дар он додаҳо дар шакли ҷуфтҳои «калид — қимат» нигоҳ дошта мешаванд. Бо донистани калид, шумо метавонед қимати онро дар як лаҳза пайдо кунед.
Эълони харита:
var telefonho map[string]string // харитае, ки калидаш сатр ва қиматаш сатр аст
Диққат: Тағйирёбандаи боло ҳоло харитаи
nilаст: аз он хондан мумкин аст (қимати сифрӣ бармегардад), аммо навиштан ба он боисиpanicмегардад (assignment to entry in nil map). Пеш аз навиштан харитаро ҳатман боmake(map[string]string)ё боmap[string]string{}созед.
Барои оғози кор бо харита, онро бо функсияи make месозанд:
package main
import "fmt"
func main() {
// Сохтани харитаи рақамҳои телефон
telefonho := make(map[string]string)
// Илова кардани маълумот
telefonho["Алишер"] = "935001122"
telefonho["Мадина"] = "988776655"
telefonho["Рустам"] = "901234567"
// Хондани маълумот бо калид
fmt.Println("Телефони Мадина:", telefonho["Мадина"])
// Нест кардани унсур бо функсияи delete
delete(telefonho, "Рустам")
// Гузаштан аз рӯи харита бо даври for range
fmt.Println("--- Рӯйхати тамосҳо ---")
for nom, raqam := range telefonho {
fmt.Printf("%s: %s\n", nom, raqam)
}
}
Тартиби унсурҳо дар харита
Харита тартиби илова шудани унсурҳоро нигоҳ намедорад. Тартиби гузариши for range муайян нест ва ҳатто дар ду гузариши пайдарпай метавонад фарқ кунад. Аз ин рӯ ба тартиби унсурҳои харита такя накунед.
Агар тартиби муайян (масалан, алифбоӣ) лозим бошад, калидҳоро ба буриш ҷамъ карда, онро бо slices.Sort мураттаб мекунем:
package main
import (
"fmt"
"slices"
)
func main() {
bahoho := map[string]int{
"Физика": 4,
"Алгебра": 5,
"Таърих": 5,
"Геометрия": 4,
}
// 1. Калидҳоро ба буриш ҷамъ мекунем
kalidho := make([]string, 0, len(bahoho))
for fan := range bahoho {
kalidho = append(kalidho, fan)
}
// 2. Буришро аз рӯи алифбо мураттаб мекунем
slices.Sort(kalidho)
// 3. Акнун бо тартиби доимӣ чоп мекунем
for _, fan := range kalidho {
fmt.Printf("%-10s %d\n", fan, bahoho[fan])
}
}
Натиҷа (ҳамеша бо ҳамин тартиб):
Алгебра 5
Геометрия 4
Таърих 5
Физика 4
Санҷиши мавҷудияти калид
Агар шумо кӯшиш кунед калидеро бихонед, ки дар харита вуҷуд надорад, Go қимати сифрии навъро (zero value: сатри холӣ, 0, false ва ғ.) бармегардонад. Барои фаҳмидани он ки оё ин калид воқеан вуҷуд дорад, шакли дуқиматаи «қимат, ok» (comma ok) истифода мешавад:
raqam, hast := telefonho["Баҳром"]
if hast {
fmt.Println("Рақам ёфт шуд:", raqam)
} else {
fmt.Println("Ин шахс дар рӯйхати тамосҳо вуҷуд надорад!")
}
Худатон бисанҷед
10–1. Сохтори Китоб: Сохторе бо номи Kitob созед, ки дорои майдонҳои Nom (сатр), Muallif (сатр), Sol (адади бутун) ва Sahifaho (адади бутун) бошад. Се китоби дӯстдоштаатонро эълон карда, маълумоти онҳоро чоп кунед.
10–2. Методи масоҳати доира: Сохтори Doira-ро бо майдони Radius float64 эълон намоед ва барои он ду метод созед: Masohat() float64 ва DaroziiDavra() float64. Методи сеюм Kalonkardan(k float64)-ро бо қабулкунандаи нишондиҳандагӣ созед, ки радиусро k маротиба калон кунад.
10–3. Луғати баҳоҳо бо map: Харитае созед, ки дар он номи фанҳо калид ва баҳоҳои гирифтаатон қимат бошанд (масалан: "Алгебра": 5, "Физика": 4). Бо ёрии даври for range баҳои миёнаи умумиро ҳисоб кунед ва фанҳоро бо тартиби алифбоӣ чоп намоед.
Хулоса
Дар ин боб шумо фаҳмидед, ки чӣ тавр бо ёрии сохторҳо (struct) маълумоти воқеиро ташкил ва идора кунед, чӣ тавр методҳоро ба сохторҳо пайваст намоед ва кай қабулкунандаи нишондиҳандагӣ лозим аст. Ҳамчунин бо харитаҳо (map) шинос шудед, ки барои ҷустуҷӯи босуръати иттилоот аз рӯи калид беҳтарин васила ба шумор мераванд, ва омӯхтед, ки тартиби онҳо кафолат дода намешавад.
Дар боби 11 мо ба мавзӯи графика ва тасвир дар Go мегузарем ва сохтани графикҳои функсияҳо ва файлҳои тасвириро меомӯзем.

Барномасозӣ
Олами Афсонаҳо
Ахбор
Саломатӣ
Дунё