Translate

Understanding the Meaning of "GO" in Hindi | Go in Hindi

Understanding the Meaning of "GO" in Hindi ➡ Hello and Welcome to All Our Visitors from around the world! We’re excited to hav...

Channels in Golang

Channels in Go

Channels Go में एक synchronization और communication mechanism होते हैं, जो goroutines के बीच data को safely और efficiently transfer करने के लिए उपयोग किए जाते हैं। Channels एक pipeline की तरह काम करते हैं, जिनके जरिए एक goroutine से data को send और दूसरी goroutine से receive किया जा सकता है।

Basic Syntax for Creating a Channel

Channels को declare और initialize करने के लिए make() function का उपयोग किया जाता है। Channels को specific data type के लिए बनाया जाता है, यानी कि आप channels में सिर्फ उस data type के values को send और receive कर सकते हैं।

ch := make(chan T)

Where T is the data type that the channel will store, such as int, string, etc.

Example: Creating and Using a Channel

package main

import (
    "fmt"
)

func main() {
    // Channel creation
    ch := make(chan int)

    // Sending data to the channel in a new goroutine
    go func() {
        ch <- 42 // Send data to the channel
    }()

    // Receiving data from the channel
    result := <-ch // Receive data from the channel
    fmt.Println("Received:", result)
}

Explanation:

  • ch := make(chan int): यह एक integer type का channel create करता है।
  • ch <- 42: इस line में 42 value को channel में भेजा जा रहा है।
  • result := <-ch: इस line में channel से value को receive किया जा रहा है और इसे result variable में store किया गया है।

Output: "Received: 42"

How Channels Work

  • Channels एक goroutine से दूसरे goroutine तक data को pass करते हैं।
  • जब आप data को एक channel में send करते हैं, तो sending goroutine तब तक block रहता है जब तक कोई दूसरा goroutine उस data को receive नहीं कर लेता।
  • इसी तरह, receiving goroutine भी तब तक block रहता है जब तक channel में कोई data नहीं आ जाता।

1. Buffered and Unbuffered Channels

  • Unbuffered Channels: ये channels सिर्फ एक value को hold करते हैं और जब तक value send और receive नहीं होती, दोनों goroutines block रहते हैं।
  • Buffered Channels: ये channels एक buffer के साथ आते हैं, यानी कि आप कई values को send कर सकते हैं और receiving goroutine को block किए बिना data भेज सकते हैं। लेकिन जब buffer full हो जाता है, तो sending goroutine block हो जाता है।

Example: Buffered Channel

package main

import (
    "fmt"
)

func main() {
    // Buffered channel creation with buffer size 2
    ch := make(chan int, 2)

    // Sending two values to the buffered channel
    ch <- 10
    ch <- 20

    // Receiving values from the channel
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}

Explanation:

  • make(chan int, 2): यह एक buffered channel है जिसमें 2 values store की जा सकती हैं।
  • ch <- 10 और ch <- 20: ये दो values बिना block हुए channel में भेजी जा रही हैं।

Output: "10" और "20"

2. Closing a Channel

Channels को close() function से बंद किया जा सकता है। एक बार channel close हो जाने पर, आप उसमें से data receive कर सकते हैं, लेकिन उसमें और data send नहीं कर सकते।

Example: Closing a Channel

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int, 2)

    // Sending values to the channel
    ch <- 10
    ch <- 20

    // Closing the channel
    close(ch)

    // Receiving values from the channel
    fmt.Println(<-ch)
    fmt.Println(<-ch)

    // Receiving from closed channel returns zero value
    fmt.Println(<-ch) // Output will be zero value of int, which is 0
}

Explanation:

  • close(ch): यह function channel को close कर देता है।
  • Receiving from a closed channel: Closed channel से data receive किया जा सकता है, लेकिन अगर channel empty है, तो यह zero value return करेगा।

Output: "10", "20", और "0"

3. Checking if a Channel is Closed

Channel से data receive करते समय यह check किया जा सकता है कि channel बंद हो चुका है या नहीं। इसके लिए आप comma-ok syntax का उपयोग कर सकते हैं।

Example: Checking if a Channel is Closed

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int, 2)

    // Sending values to the channel
    ch <- 10
    ch <- 20

    // Closing the channel
    close(ch)

    // Receiving values with a check for closed channel
    for {
        val, ok := <-ch
        if !ok {
            fmt.Println("Channel is closed")
            break
        }
        fmt.Println("Received:", val)
    }
}

Explanation:

  • val, ok := <-ch: यह check करता है कि क्या channel से value मिली है और channel बंद है या नहीं।
  • if !ok: अगर ok false है, तो इसका मतलब है कि channel बंद हो चुका है।

Output: "Received: 10", "Received: 20", और "Channel is closed"

4. Select Statement with Channels

Go में select statement का उपयोग multiple channels के साथ concurrent operations को handle करने के लिए किया जाता है। select statement यह देखता है कि कौन-सा channel ready है, और फिर उस channel से data receive या send करता है।

Example: Select Statement

package main

import (
    "fmt"
    "time"
)

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)

    // Goroutine for sending data to ch1
    go func() {
        time.Sleep(1 * time.Second)
        ch1 <- "Message from ch1"
    }()

    // Goroutine for sending data to ch2
    go func() {
        time.Sleep(2 * time.Second)
        ch2 <- "Message from ch2"
    }()

    // Using select to receive from whichever channel is ready first
    select {
    case msg1 := <-ch1:
        fmt.Println(msg1)
    case msg2 := <-ch2:
        fmt.Println(msg2)
    }
}

Explanation:

  • select: यह wait करता है कि कौन-सा channel पहले ready होता है। जो भी channel पहले ready हो जाता है, उसे process कर लेता है।

Output: "Message from ch1" (चूंकि ch1 पहले 1 सेकंड बाद ready हो जाता है)

5. Goroutines and Channels Together

Channels और goroutines का combination concurrency को manage करने का powerful तरीका है। आप multiple goroutines को channels के जरिए communicate करवा सकते हैं।

Example: Goroutines Communicating via Channels

package main

import (
    "fmt"
    "time"
)

func worker(id int, ch chan int) {
    for job := range ch {
        fmt.Printf("Worker %d processing job %d\n", id, job)
        time.Sleep(1 * time.Second) // Simulate processing time
    }
}

func main() {
    jobs := make(chan int, 5)

    // Starting 3 worker goroutines
    for i := 1; i <= 3; i++ {
        go worker(i, jobs)
    }

    // Sending 5 jobs to workers
    for j := 1; j <= 5; j++ {
        jobs <- j
    }

    close(jobs) // Close the jobs channel when all jobs are sent

    // Wait to see workers complete their tasks
    time.Sleep(5 * time.Second)
}

Explanation:

  • worker(): यह function jobs को process करता है और हर job के बाद 1 सेकंड का wait करता है।
  • Multiple Goroutines: यहां हमने 3 workers बनाए हैं, जो एक साथ jobs को process कर रहे हैं।

Output: "Worker 1 processing job 1", "Worker 2 processing job 2", etc.

Summary

  • Channels: Goroutines के बीच data को safely transfer करने के लिए उपयोग किए जाते हैं।
  • Unbuffered Channels: Data send और receive करने पर दोनों goroutines block होते हैं।
  • Buffered Channels: Multiple values को store कर सकते हैं, और जब buffer full हो जाता है, तब sending goroutine block होता है।
  • Channel Closing: Channels को close() function से बंद किया जा सकता है। बंद channel से data receive किया जा सकता है लेकिन send नहीं किया जा सकता।
  • Select Statement: Multiple channels के साथ concurrent operations को handle करने के लिए select statement का उपयोग किया जाता है।
  • Goroutines and Channels: Channels और goroutines का combination concurrent और parallel processing को आसान बनाता है।

Channels Go में concurrency और synchronization के लिए एक powerful tool हैं। अगर आपको channels के बारे में और जानकारी चाहिए या कोई specific सवाल है, तो बताइए!

No comments: