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

Китоби таълимии забони Go барои мактабиён, донишҷӯён ва омӯзгорон: аз алгоритм ва блок-схемаҳо то веб-сервер ва боти Телеграм. Таҷдиди китоби А. П. Назаров «Алгоритмсозӣ ва барномасозӣ дар забони Бейсик» (2009).
Агенти Зеҳнӣ · 26 октябри 2026 · 15 саҳифа
Боби 12. Лоиҳаҳои воқеӣ: Аз барномаҳои оддӣ то веб ва ботҳо
Боби 12. Лоиҳаҳои воқеӣ: Аз барномаҳои оддӣ то веб ва ботҳо
То ин боб мо асосан барномаҳое менавиштем, ки дар терминали сатри фармон (CLI) кор мекарданд. Go барои сохтани хидматҳои веб, абзорҳои абрӣ ва барномаҳои шабакавӣ низ истифода мешавад. Дар ин боб шумо чанд лоиҳаи амалӣ — веб-сервер, REST API, боти Телеграм ва барномаи ҳамзамон — месозед.
Дар ин боб меомӯзем
- Самтҳои асосии истифодаи Go дар соҳаи IT ва ширкатҳои пешрафтаи ҷаҳон.
- Лоиҳаи 1: Офаридани веб-сервери воқеӣ бо саҳифаи интерактивии HTML ва масирҳои (routes) Go 1.22.
- Лоиҳаи 2: Сохтани хидматрасонии REST API ва коркарди додаҳои JSON.
- Лоиҳаи 3: Тарзи сохтани боти Телеграм дар забони Go ва нигоҳдории бехатари токен.
- Лоиҳаи 4: Барномасозии ҳамзамон (concurrency): санҷиши босуръати сомонаҳо бо горутинаҳо ва каналҳо.
- Самтҳои дигар: офаридани бозиҳои 2D (Ebitengine) ва барномаҳои тирезавии мизи корӣ (Fyne).
Забони Go дар куҷо истифода мешавад?
Go яке аз маҳбубтарин забонҳо барои сохтани лоиҳаҳои муосири зерин аст:
- Инфрасохтори абрӣ ва DevOps: Бисёре аз абзорҳои муҳимтарини абрии даҳсолаи охир маҳз бо забони Go навишта шудаанд:
- Docker — системаи машҳури ҷаҳонии контейнеризатсия.
- Kubernetes (K8s) — бузургтарин платформаи идораи хидматҳои абрӣ, ки дар Google офарида шудааст.
- Terraform, Prometheus, Traefik, Caddy — ҳама бо Go сохта шудаанд.
- Хидматрасониҳои баландбор (High-Load Web Services):
- Ширкатҳое чун Google, Cloudflare, Uber, Twitch ва PayPal дар бисёр хидматҳои сервериашон Go-ро истифода мебаранд, зеро барномаҳои Go шумораи зиёди дархостҳоро ҳамзамон бо истифодаи ками хотира коркард мекунанд.
- Пойгоҳҳои додаҳои насли нав:
- Пойгоҳҳои тақсимшудаи CockroachDB, TiDB ва etcd бо Go офарида шудаанд.
- Финтек ва системаҳои бонкӣ:
- Аз сабаби навъгузории қатъӣ, коркарди возеҳи хатогиҳо ва суръати баланд, бонкҳо ва ширкатҳои пардохтӣ барои интиқоли пул ва коркарди транзаксияҳо аз Go истифода мебаранд.
- Ботҳои паёмрасон (Telegram, Discord, Slack):
- Go барои сохтани ботҳое мувофиқ аст, ки дархостҳои бисёр корбарро ҳамзамон коркард мекунанд.
Биёед ҳоло чор лоиҳаи воқеиро муфассал баррасӣ намоем!
Лоиҳаи 1: Веб-сервер ва сомонаи интерактивӣ дар Go
Бастаи стандартии net/http воситаҳои сохтани веб-серверро дар бар мегирад. Барои лоиҳаи ин боб насби сервер ё китобхонаи иловагӣ лозим нест.
Масирҳо (routes) дар Go 1.22
Аз версияи Go 1.22 сар карда, ҳангоми сабти коркардкунанда (handler) метавон усули HTTP ва қолаби роҳ-ро якҷоя навишт:
| Қолаб | Маъно |
|---|---|
"GET /{$}" | Дархости GET ё HEAD танҳо ба саҳифаи асосӣ / |
"POST /{$}" | Танҳо дархости POST ба саҳифаи асосӣ |
"GET /api/students" | Дархости GET ё HEAD ба ҳамин роҳи дақиқ |
"GET /api/students/{id}" | {id} — қисми тағйирёбандаи роҳ; қиматашро бо r.PathValue("id") мегирем |
Агар корбар ба роҳе равад, ки сабт нашудааст, сервер худкор 404 Not Found ва барои усули нодуруст 405 Method Not Allowed бармегардонад. Аломати махсуси {$} маънои «охири роҳ»-ро дорад: бе он қолаби "/" ҳамаи роҳҳоро (масалан /favicon.ico) мегирифт.
Биёед барномае нависем, ки дар компютери шумо веб-серверро ба кор андозад ва саҳифаи интерактивиро бо формулаи масоҳати росткунҷа нишон диҳад.
Файли web_server.go:
package main
import (
"fmt"
"log"
"net/http"
"strconv"
)
// Саҳифаи асосӣ бо шакли воридоти HTML (дархости GET)
const sahifaiForma = `
Ҳисобкунаки геометрӣ дар Go
Ҳисобкунаки росткунҷа
Тарафи A:
Тарафи B:
Ҳисоб кардан
`
// Саҳифаи натиҷа (дархости POST); %.2f ҷойҳои ададҳо мебошанд
const sahifaiNatija = `
Натиҷа
Натиҷаи ҳисоббарорӣ:
Тарафҳо: a = %.2f, b = %.2f
Масоҳат (S): %.2f
Периметр (P): %.2f
◄ Ҳисоби нав
`
// GET / — нишон додани шакл
func formaNishonDodan(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
fmt.Fprint(w, sahifaiForma)
}
// POST / — қабули ададҳо ва ҳисоб
func hisobKardan(w http.ResponseWriter, r *http.Request) {
a, err1 := strconv.ParseFloat(r.FormValue("a"), 64)
b, err2 := strconv.ParseFloat(r.FormValue("b"), 64)
if err1 != nil || err2 != nil || a <= 0 || b <= 0 {
// http.Error сарлавҳа, рамзи 400 ва матни хаторо худаш мефиристад
http.Error(w, "Хато: лутфан ададҳои мусбати дурустро ворид кунед!", http.StatusBadRequest)
return
}
s := a * b
p := 2 * (a + b)
w.Header().Set("Content-Type", "text/html; charset=utf-8")
fmt.Fprintf(w, sahifaiNatija, a, b, s, p)
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /{$}", formaNishonDodan)
mux.HandleFunc("POST /{$}", hisobKardan)
fmt.Println("Веб-сервер дар нишонии http://localhost:8080 фаъол шуд!")
fmt.Println("Браузери худро кушоед ва ба http://localhost:8080 гузаред...")
// ListenAndServe танҳо ҳангоми хато бармегардад (масалан, порт банд аст)
log.Fatal(http.ListenAndServe(":8080", mux))
}
Тарзи иҷро:
- Барномаро бо фармони
go run web_server.goба кор дароред. - Веб-браузери худро (Chrome, Firefox ё Safari) кушоед ва ба нишонии
http://localhost:8080гузаред. - Ададҳоро ворид кунед ва тугмаи «Ҳисоб кардан»-ро пахш намоед. Сервери Go дар ҳамон лаҳза натиҷаро ҳисоб карда, дар экран инъикос мекунад. Агар ба ҷойи адад ҳарф нависед, сервер бо рамзи 400 Bad Request паёми хаторо бармегардонад.
- Барои қатъ кардани сервер дар терминал
Ctrl+C-ро пахш кунед.
Чаро
Content-Type? Агар сарлавҳаиContent-Type-ро худамон нагузорем, Go навъи ҷавобро аз рӯи аввали матн «тахмин» мезанад ва баъзан хато мекунад — масалан, порчаи...ҳамчун матни оддӣ (text/plain) фиристода мешавад ва браузер барчаспҳоро айнан нишон медиҳад.
Лоиҳаи 2: Сохтани хидматрасонии REST API бо формати JSON
Бисёр барномаҳои мобилӣ ва сомонаҳо барои мубодилаи додаҳо бо сервер формати JSON (JavaScript Object Notation)-ро истифода мебаранд.
Биёед як сервиси ҳақиқии API барои рӯйхати хонандагон бо Go созем. Он ду масир дорад: рӯйхати пурра ва як хонанда аз рӯи рақамаш (id).
Файли api_server.go:
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"strconv"
)
// Сохтори маълумоти хонанда
// Нишонаҳои `json:"..."` номи майдонҳоро дар формати JSON муайян мекунанд
type Xonanda struct {
ID int `json:"id"`
Nom string `json:"nom"`
Sinf int `json:"sinf"`
Baho float64 `json:"baho"`
}
var royxat = []Xonanda{
{ID: 1, Nom: "Алишер", Sinf: 10, Baho: 4.8},
{ID: 2, Nom: "Мадина", Sinf: 11, Baho: 5.0},
{ID: 3, Nom: "Рустам", Sinf: 10, Baho: 4.2},
}
// javobiJSON қимати v-ро бо рамзи status ҳамчун JSON мефиристад
func javobiJSON(w http.ResponseWriter, status int, v any) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(status)
if err := json.NewEncoder(w).Encode(v); err != nil {
log.Println("Хато ҳангоми навиштани JSON:", err)
}
}
// GET /api/students — ҳамаи хонандагон
func hamaiXonandagon(w http.ResponseWriter, r *http.Request) {
javobiJSON(w, http.StatusOK, royxat)
}
// GET /api/students/{id} — як хонанда
func yakXonanda(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(r.PathValue("id"))
if err != nil {
javobiJSON(w, http.StatusBadRequest, map[string]string{"xato": "id бояд адади бутун бошад"})
return
}
for _, x := range royxat {
if x.ID == id {
javobiJSON(w, http.StatusOK, x)
return
}
}
javobiJSON(w, http.StatusNotFound, map[string]string{"xato": "хонанда ёфт нашуд"})
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /api/students", hamaiXonandagon)
mux.HandleFunc("GET /api/students/{id}", yakXonanda)
fmt.Println("REST API фаъол шуд дар: http://localhost:8080/api/students")
log.Fatal(http.ListenAndServe(":8080", mux))
}
Агар шумо ин серверро ба кор дароред ва дар браузер нишонии http://localhost:8080/api/students-ро кушоед (ё дар терминали дигар фармони curl-ро иҷро кунед), ҷавоби JSON-ро хоҳед дид. json.Encoder онро дар як сатр, бе фосилаҳои иловагӣ менависад (баъзе браузерҳо онро худашон зебо нишон медиҳанд):
$ curl http://localhost:8080/api/students
[{"id":1,"nom":"Алишер","sinf":10,"baho":4.8},{"id":2,"nom":"Мадина","sinf":11,"baho":5},{"id":3,"nom":"Рустам","sinf":10,"baho":4.2}]
$ curl http://localhost:8080/api/students/2
{"id":2,"nom":"Мадина","sinf":11,"baho":5}
$ curl -i http://localhost:8080/api/students/7
HTTP/1.1 404 Not Found
Content-Type: application/json; charset=utf-8
...
{"xato":"хонанда ёфт нашуд"}
Диққат кунед: 5.0 дар JSON ҳамчун 5 навишта мешавад — ин барои JSON ҳамон як адад аст. Агар хоҳед, ки ҷавоб бо фосилаҳо ва сатрҳои нав хонотар бошад, пеш аз Encode фармони enc.SetIndent("", " ")-ро истифода баред.
Ҳамин гуна API-ҳо асоси сохтани барномаҳои бонкӣ, таксӣ, мағозаҳои интернетӣ ва шабакаҳои иҷтимоиро ташкил медиҳанд!
Лоиҳаи 3: Офаридани боти Телеграм дар Go
Телеграм дар Тоҷикистон ва минтақа яке аз серистифодатарин паёмрасонҳост. Бо ёрии забони Go шумо метавонед ботҳои босуръат ва пуриқтидор созед, ки метавонанд масъалаҳои риёзиро ҳал кунанд, ба саволҳо посух диҳанд ё хабарҳоро расонанд.
Бот чӣ гуна кор мекунад?
Дар ин лоиҳа бот барномаи Go мебошад, ки тавассути дархостҳои HTTPS бо Telegram Bot API кор мекунад. Барои гирифтани паёмҳо усули long polling-ро истифода мебарем:
- Корбар ба бот паём менависад (масалан
/start). - Сервери Телеграм паёмро дар навбат нигоҳ медорад.
- Барномаи Go мунтазам бо усули
getUpdatesаз сервер мепурсад: «Паёми нав ҳаст?». Сервер то 25 сония интизор мешавад ва ҳамин ки паём омад, онро бармегардонад. - Барномаи Go фармонро таҳлил карда, ҷавобро бо усули
sendMessageба Телеграм мефиристад.
(Усули дигар — webhook — баръакс аст: сервери Телеграм худаш паёмҳоро ба нишонии веб-сервери шумо мефиристад. Барои ин сервер бояд аз интернет дастрас бошад ва сертификати HTTPS дошта бошад.)
Токен — калиди махфии бот
Пас аз сохтани бот дар @BotFather шумо токен мегиред (масалан 123456:ABC-DEF...). Ҳар касе, ки токенро донад, боти шуморо пурра идора карда метавонад.
Огоҳӣ: Токенро ҳеҷ гоҳ дар худи код нанависед, ба GitHub бор накунед ва ба касе нафиристед. Онро дар тағйирёбандаи муҳит (environment variable) нигоҳ доред ва барнома онро бо
os.Getenvмехонад. Агар токен ифшо шавад, дар @BotFather фармони/revoke-ро иҷро карда, токени нав гиред.
Ба кор андохтани бот:
# macOS / Linux
export TELEGRAM_BOT_TOKEN="токени_шумо"
go run bot.go
# Windows (PowerShell)
$env:TELEGRAM_BOT_TOKEN="токени_шумо"
go run bot.go
Файли bot.go:
package main
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"log"
"net/http"
"net/url"
"os"
"time"
)
// Message — паёми Телеграм (танҳо майдонҳое, ки ба мо лозиманд)
type Message struct {
Chat struct {
ID int64 `json:"id"`
} `json:"chat"`
Text string `json:"text"`
}
// Update — як навсозӣ. Message нишондиҳанда аст, зеро на ҳар навсозӣ паём дорад
// (масалан, паёми таҳриршуда ё пахши тугма).
type Update struct {
UpdateID int `json:"update_id"`
Message *Message `json:"message"`
}
// TelegramResponse — ҷавоби умумии Bot API
type TelegramResponse struct {
Ok bool `json:"ok"`
Description string `json:"description"`
Result []Update `json:"result"`
}
// Муштарии HTTP бо мӯҳлат: дархост ҳеҷ гоҳ абадӣ овезон намемонад.
// Мӯҳлат аз timeout-и long polling (25 с) калонтар аст.
var mushtari = &http.Client{Timeout: 35 * time.Second}
var baseURL string
// xatoiBeToken хатои шабакаро бе нишонии URL (ки дар он токен ҳаст) бармегардонад
func xatoiBeToken(err error) error {
var uerr *url.Error
if errors.As(err, &uerr) {
return uerr.Err
}
return err
}
// payomFiristodan ба чат матнро мефиристад
func payomFiristodan(chatID int64, matn string) error {
jsonData, err := json.Marshal(map[string]any{
"chat_id": chatID,
"text": matn,
})
if err != nil {
return err
}
resp, err := mushtari.Post(baseURL+"/sendMessage", "application/json", bytes.NewReader(jsonData))
if err != nil {
return xatoiBeToken(err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("sendMessage: рамзи ҷавоб %d", resp.StatusCode)
}
return nil
}
// navsoziho паёмҳои навро бо long polling мегирад
func navsoziho(offset int) ([]Update, error) {
resp, err := mushtari.Get(fmt.Sprintf("%s/getUpdates?offset=%d&timeout=25", baseURL, offset))
if err != nil {
return nil, xatoiBeToken(err)
}
defer resp.Body.Close()
var tgResp TelegramResponse
if err := json.NewDecoder(resp.Body).Decode(&tgResp); err != nil {
return nil, err
}
if !tgResp.Ok {
return nil, fmt.Errorf("Telegram: %s (рамзи %d)", tgResp.Description, resp.StatusCode)
}
return tgResp.Result, nil
}
// javob матни ҷавобро вобаста ба фармон интихоб мекунад
func javob(matn string) string {
switch matn {
case "/start":
return "Салом! Ман боти таълимии Go ҳастам! Фармонҳои /hikmat ё /vaqt-ро санҷед."
case "/vaqt":
return "Вақти ҷорӣ: " + time.Now().Format("15:04:05 (02.01.2006)")
case "/hikmat":
return "«Дониш андар дил чароғи равшан аст, / В-аз ҳама бад бар тани ту ҷавшан аст.» — Рӯдакӣ"
default:
return "Шумо навиштед: " + matn
}
}
func main() {
token := os.Getenv("TELEGRAM_BOT_TOKEN")
if token == "" {
log.Fatal("Тағйирёбандаи муҳити TELEGRAM_BOT_TOKEN холӣ аст. Токенро аз @BotFather гиред ва онро гузоред.")
}
baseURL = "https://api.telegram.org/bot" + token
fmt.Println("Боти Телеграм фаъол шуд... (барои қатъ Ctrl+C)")
offset := 0
// Даври беохир барои гирифтани паёмҳои нав
for {
updates, err := navsoziho(offset)
if err != nil {
log.Println("Хато ҳангоми гирифтани паёмҳо:", err)
time.Sleep(3 * time.Second)
continue
}
for _, u := range updates {
offset = u.UpdateID + 1 // ин навсозиро дигар намегирем
if u.Message == nil || u.Message.Text == "" {
continue // навсозӣ бе паёми матнӣ
}
fmt.Printf("Паёми нав: %s\n", u.Message.Text)
if err := payomFiristodan(u.Message.Chat.ID, javob(u.Message.Text)); err != nil {
log.Println("Хато ҳангоми фиристодани ҷавоб:", err)
}
}
}
}
Нуктаҳои муҳими ин код:
- Токен аз муҳит хонда мешавад ва ҳатто дар паёмҳои хато чоп намешавад (функсияи
xatoiBeToken), зеро хатоҳоиnet/httpнишонии пурраи URL-ро дар бар мегиранд. - Баданаи ҳар ҷавоби HTTP бо
defer resp.Body.Close()баста мешавад. Ин барои озод кардани захираҳои шабакавӣ зарур аст. - Майдони
Okсанҷида мешавад: агар токен нодуруст бошад, Телеграм{"ok":false,"description":"Unauthorized"}бармегардонад ва мо инро дар экран мебинем. offsetбаupdate_id + 1баробар мешавад, то дар дархости навбатӣ паёмҳои пешина дубора гирифта нашаванд. Дар ин намунаoffsetтанҳо дар хотира аст; ин худ аз худ коркарди маҳз яккаратаи паёмҳоро пас аз қатъу оғози барнома кафолат намедиҳад.
Дар лоиҳаҳои калон метавонед ба ҷойи коди дастӣ китобхонаҳои тайёри Bot API-ро истифода баред, аммо коди боло нишон медиҳад, ки «дар дохили» онҳо чӣ рух медиҳад.
Лоиҳаи 4: Санҷиши ҳамзамони сомонаҳо (Concurrency & Goroutines)
Яке аз бузургтарин сабабҳои маҳбубияти Go — ин горутинаҳо (goroutines) мебошанд. Горутина ҷараёни сабуки ҳамзамон аст, ки бо як калимаи оддии go пеш аз даъвати функсия оғоз мешавад:
go koreroIjroKun()
Тасаввур кунед, ки мехоҳед дастрас будани 10 сомонаро санҷед.
- Агар онҳоро якто-якто пайдарпай санҷед ва ҳар як санҷиш 1 сония вақт гирад, барнома 10 сония вақтро мегирад.
- Бо Go метавон ҳар 10 сомонаро ҳамзамон санҷид. Дар шароити мусоид вақти умумӣ ба вақти санҷиши сусттарин сомона — дар ин мисол тақрибан 1 сония — наздик мешавад.
Файли concurrent_checker.go:
package main
import (
"fmt"
"net/http"
"time"
)
// Муштарии HTTP бо мӯҳлати 10 сония: сомонаи «овезон» барномаро абадӣ боз намедорад
var mushtari = &http.Client{Timeout: 10 * time.Second}
// Функсияи санҷиши як сомона
func somonaroSanjidan(url string, natijaChan chan<- string) {
vaqtiOghoz := time.Now()
resp, err := mushtari.Get(url)
muddat := time.Since(vaqtiOghoz).Round(time.Millisecond)
if err != nil {
natijaChan <- fmt.Sprintf("[ХАТО] %-25s | Дастнорас: %v", url, err)
return
}
defer resp.Body.Close()
holat := "[ФАЪОЛ]"
if resp.StatusCode >= 400 {
holat = "[ОГОҲӢ]" // сервер ҷавоб дод, аммо бо рамзи хато (4xx/5xx)
}
natijaChan <- fmt.Sprintf("%s %-25s | Рамз: %d | Вақт: %v", holat, url, resp.StatusCode, muddat)
}
func main() {
somonaho := []string{
"https://google.com",
"https://github.com",
"https://go.dev",
"https://wikipedia.org",
"https://stackoverflow.com",
}
// Канал (channel) барои гирифтани натиҷаҳо аз горутинаҳо
natijaChan := make(chan string)
vaqtiKull := time.Now()
fmt.Println("Санҷиши ҳамзамони сомонаҳо оғоз шуд...")
// Ҳар як сомонаро дар горутинаи алоҳида ба кор меандозем
for _, s := range somonaho {
go somonaroSanjidan(s, natijaChan)
}
// Ҷамъоварии натиҷаҳо аз канал: аниқ ба шумораи сомонаҳо
for range somonaho {
payom := <-natijaChan
fmt.Println(payom)
}
fmt.Printf("\nҲамаи сомонаҳо дар зарфи %v санҷида шуданд!\n", time.Since(vaqtiKull).Round(time.Millisecond))
}
Намунаи натиҷа дар консол (вақтҳо, рамзҳо ва ҳатто тартиби сатрҳо вобаста ба шабакаи шумо ҳар дафъа гуногун мешаванд — сомонае, ки зудтар ҷавоб дод, аввал чоп мешавад):
Санҷиши ҳамзамони сомонаҳо оғоз шуд...
[ФАЪОЛ] https://github.com | Рамз: 200 | Вақт: 468ms
[ОГОҲӢ] https://wikipedia.org | Рамз: 403 | Вақт: 644ms
[ФАЪОЛ] https://go.dev | Рамз: 200 | Вақт: 814ms
[ОГОҲӢ] https://stackoverflow.com | Рамз: 403 | Вақт: 1.005s
[ФАЪОЛ] https://google.com | Рамз: 200 | Вақт: 1.254s
Ҳамаи сомонаҳо дар зарфи 1.255s санҷида шуданд!
Вақти умумӣ ба вақти санҷиши сусттарин сомона наздик аст. Ин натиҷаи иҷрои ҳамзамони дархостҳост. Рамзи 403 маънои онро дорад, ки сервер дархостро фаҳмидааст, вале иҷрои онро рад мекунад; сабаб танҳо аз ҳамин рамз маълум намешавад.
Самтҳои дигар: бозиҳои 2D ва барномаҳои графикӣ (GUI)
Ҳарчанд Go асосан барои системаҳои серверӣ ва шабакавӣ маъруф аст, экосистемаи он барои барномаҳои визуалӣ низ рӯз аз рӯз пеш меравад:
- Офаридани бозиҳои дученака (Ebitengine):
- Китобхонаи кушодаасоси Ebitengine (ebitengine.org) ба шумо имкон медиҳад бо забони Go бозиҳои 2D созед, ки дар Windows, macOS, Linux, Android, iOS ва ҳатто дар браузер (WebAssembly) кор мекунанд. Якчанд бозии тиҷоратӣ дар платформаи Steam маҳз бо Ebitengine офарида шудаанд.
- Барномаҳои тирезавии мизи корӣ (Fyne):
- Китобхонаи Fyne (fyne.io) имкон медиҳад, ки барномаҳои графикии тирезагӣ (бо тугмаҳо, равзанаҳо, менюҳо ва ҷадвалҳо) созед, ки намуди муосир доранд ва дар системаҳои гуногун бе тағйири код кор мекунанд.
Худатон бисанҷед
12–1. Саҳифаи ҷадвали зарб дар веб: Барномаи веб-сервери Лоиҳаи 1-ро тавре такмил диҳед, ки масири нави "GET /jadval" ҷадвали зарби Пифагориро дар шакли ҷадвали HTML (``) нишон диҳад.
12–2. Хидматрасонии API-и ҳисоббарорӣ: Сервиси REST API созед, ки дархостҳоро бо нишонии GET /api/kvadrat?a=1&b=-5&c=6 қабул кунад (параметрҳоро бо r.URL.Query().Get("a") гиред) ва решаҳои муодилаи квадратиро бо формати JSON баргардонад:
{"d": 1, "x1": 3, "x2": 2, "resha_dorad": true}
Агар параметр адад набошад, бо http.StatusBadRequest ҷавоб диҳед.
12–3. Боргирии ҳамзамони файлҳо: Барномае нависед, ки бо истифода аз горутинаҳо, http.Client бо муҳлат ва sync.WaitGroup се расми гуногунро аз интернет ҳамзамон боргирӣ карда, дар диски компютер сабт намояд. Ҳамаи хатогиҳоро санҷед ва ҳар resp.Body-ро пӯшед.
Хулоса
Дар ин боб шумо дидед, ки забони Go чӣ гуна аз ҳудуди барномаҳои оддии таълимӣ берун мебарояд ва ба яке аз пуриқтидортарин василаҳои офаридани нармафзори воқеӣ табдил меёбад. Шумо сохтани серверҳои веб бо масирҳои Go 1.22, REST API-ҳои муосир, ботҳои паёмрасон бо нигоҳдории бехатари токен ва барномаҳои баландсуръати ҳамзамонро омӯхтед.
Дар боби 13 мо маҷмӯаи мураттабшудаи масъалаҳои амалии алгоритмсозиро аз риёзиёт ва физика бо ҳалҳои пурра бо Go баррасӣ мекунем, то шумо донишҳои худро дар ҳалли масъалаҳои мураккабтар санҷед.

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