Go
चयन करें और चैनल
खोज…
परिचय
select
कीवर्ड चैनलों के साथ काम करने और अधिक उन्नत कार्य करने के लिए एक आसान तरीका प्रदान करता है। यह अक्सर कई उद्देश्यों के लिए उपयोग किया जाता है: - टाइमआउट को संभालना। - जब वहाँ से पढ़ने के लिए कई चैनल हैं, तो चयन एक चैनल से बेतरतीब ढंग से पढ़ा जाएगा जिसमें डेटा है। - यदि चैनल पर कोई डेटा उपलब्ध नहीं है, तो परिभाषित करने के लिए एक आसान तरीका प्रदान करना।
वाक्य - विन्यास
- चुनते हैं {}
- {मामला सत्य:} चुनें
- {{आने वाले केस का चयन करें: = <-someChannel:}
- {डिफ़ॉल्ट:} चुनें
चैनल के साथ सरल चयन कार्य
इस उदाहरण में हम एक goroutine (एक समारोह एक अलग थ्रेड में चल रहा) है कि एक को स्वीकार करता chan
पैरामीटर, और बस, लूप चैनल में हर बार जानकारी भेजने।
में main
हमारे पास एक for
पाश और एक select
। जब तक case
सही नहीं हो जाता, तब तक select
प्रक्रिया को अवरुद्ध कर देगा। यहां हमने दो मामलों की घोषणा की है; पहला है जब सूचना चैनल के माध्यम से आती है, और दूसरी अगर कोई अन्य मामला नहीं होता है, जिसे default
रूप में जाना जाता default
।
// Use of the select statement with channels (no timeouts)
package main
import (
"fmt"
"time"
)
// Function that is "chatty"
// Takes a single parameter a channel to send messages down
func chatter(chatChannel chan<- string) {
// Clean up our channel when we are done.
// The channel writer should always be the one to close a channel.
defer close(chatChannel)
// loop five times and die
for i := 1; i <= 5; i++ {
time.Sleep(2 * time.Second) // sleep for 2 seconds
chatChannel <- fmt.Sprintf("This is pass number %d of chatter", i)
}
}
// Our main function
func main() {
// Create the channel
chatChannel := make(chan string, 1)
// start a go routine with chatter (separate, non blocking)
go chatter(chatChannel)
// This for loop keeps things going while the chatter is sleeping
for {
// select statement will block this thread until one of the two conditions below is met
// because we have a default, we will hit default any time the chatter isn't chatting
select {
// anytime the chatter chats, we'll catch it and output it
case spam, ok := <-chatChannel:
// Print the string from the channel, unless the channel is closed
// and we're out of data, in which case exit.
if ok {
fmt.Println(spam)
} else {
fmt.Println("Channel closed, exiting!")
return
}
default:
// print a line, then sleep for 1 second.
fmt.Println("Nothing happened this second.")
time.Sleep(1 * time.Second)
}
}
}
टाइमआउट के साथ चयन का उपयोग करना
तो यहाँ, मैं हटा दिया है for
छोरों, और एक दूसरे को जोड़कर एक समय समाप्ति बनाया case
को select
3 सेकंड के बाद कि रिटर्न। चूँकि select
किसी मामले के सत्य होने तक प्रतीक्षा करता है, दूसरा case
समाप्त हो जाता है, और फिर हमारी स्क्रिप्ट समाप्त हो जाती है, और chatter()
कभी भी समाप्त होने का मौका नहीं मिलता है।
// Use of the select statement with channels, for timeouts, etc.
package main
import (
"fmt"
"time"
)
// Function that is "chatty"
//Takes a single parameter a channel to send messages down
func chatter(chatChannel chan<- string) {
// loop ten times and die
time.Sleep(5 * time.Second) // sleep for 5 seconds
chatChannel<- fmt.Sprintf("This is pass number %d of chatter", 1)
}
// out main function
func main() {
// Create the channel, it will be taking only strings, no need for a buffer on this project
chatChannel := make(chan string)
// Clean up our channel when we are done
defer close(chatChannel)
// start a go routine with chatter (separate, no blocking)
go chatter(chatChannel)
// select statement will block this thread until one of the two conditions below is met
// because we have a default, we will hit default any time the chatter isn't chatting
select {
// anytime the chatter chats, we'll catch it and output it
case spam := <-chatChannel:
fmt.Println(spam)
// if the chatter takes more than 3 seconds to chat, stop waiting
case <-time.After(3 * time.Second):
fmt.Println("Ain't no time for that!")
}
}
Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow