Skip to content

Latest commit

 

History

History
64 lines (51 loc) · 3.4 KB

2_goroutine.md

File metadata and controls

64 lines (51 loc) · 3.4 KB

Go функц

Go функц гэдэг нь бусад функцтэй зэрэгцэн ажиллаж байгаа функц юм. Go функц үүсгэхийн тулд функцийн нэрний өмнө go түлхүүр үгийг тавьж дуудах хэрэгтэй:

package main
import "fmt"

func f(n int) {
    for i := 0; i < 10; i++ {
        fmt.Println(n, ":", i)
    }
}

func main() {
    go f(0)
    var input string
    fmt.Scanln(&input)
}

Дээрх програм нь хоёр функцээс тогтоно. Эхнийх нь main() функц өөрөө байна, хоёр дахь нь go f(0) гэсэн дуудалтаар үүснэ. Ердийн үед функц дуудахад тухайн функц дотор бичигдсэн бүх заавар ажиллаж дууссаны дараа дараагийн мөрд програмын удирдлага шилждэг. Go функцийн тохиолдолд програмын удирдлага шууд дараагийн мөрд шилжинэ, ө.х Go функц дотор бичигдсэн зааврууд ажиллаж дуусахыг хүлээхгүй гэсэн үг. Үүнийг нотлон харуулах зорилгоор Scanln() функцийг дуудсан байгаа. Энэ функц нь гараас мэдээлэл оруулахыг хүлээнэ, хэрэв ингэж хүлээхгүй бол програмын ажиллагаа шууд тасарч f() функц тоонуудыг хэвлэж амжихгүй тасрах болно.

Go функц нь маш хөнгөн байдаг бөгөөд олон тоогоор үүсгэх боломжтой байдаг. Жишээлбэл 10 ширхэг go функцийг дараах байдлаар үүсгэж болно:

func main() {
    for i := 0; i < 10; i++ {
        go f(i)
    }
    var input string
    fmt.Scanln(&input)
}

Дээрх програмыг ажиллуулахад go функцүүд дарааллаар ажиллаад байгаа мэт харагдаж байгааг ажиглаарай. Ө.х тоонууд дэс дарааллын дагуу хэвлэгдэж байна. Үнэндээ go функцүүдыг дуудсан дарааллаар маш хурдан ажиллаж дуусаад байгаа учраас тэгж харагдаж байгаа юм. Зэрэг ажиллаж байгааг нотлохын тулд тоо хэвлэлтүүдийн хооронд бага зэрэг хүлээлт оруулая. Үүнд time.Sleep ба rand.Intn функцүүдийг хослуулан ашиглаж болно:

package main

import (
  "fmt"
  "time"
  "math/rand"
)

func f(n int) {
    for i := 0; i < 10; i++ {
        fmt.Println(n, ":", i)
        amt := time.Duration(rand.Intn(250))
        time.Sleep(time.Millisecond * amt)
    }
}

func main() {
    for i := 0; i < 10; i++ {
        go f(i)
    }
    var input string
    fmt.Scanln(&input)
}

Өөрчлөлтийн үр дүнд f() функц бүр 0 – 10 хүртэлх тоог 0 - 250 миллисекундын завсарлагатайгаар хэвлэнэ. Завсарлага оруулснаар бусад функцүүд зэрэг ажиллаж ижил үйлдлийг хийж байгаа гэдгийг харах боломжтой болсон байна.