수색…
소개
select
키워드는 채널 작업 및 고급 작업 수행 방법을 제공합니다. 다음과 같은 용도로 자주 사용됩니다. - 처리 제한 시간. - 읽을 채널이 여러 개인 경우 선택 항목은 데이터가있는 채널에서 임의로 읽습니다. - 채널에서 데이터를 사용할 수없는 경우 어떤 일이 발생하는지 정의하는 쉬운 방법을 제공합니다.
통사론
- 고르다 {}
- {case true :}를 선택하십시오.
- {case incomingData : = <-someChannel :}을 선택하십시오.
- {기본 :}을 선택하십시오.
간단한 채널 작업 선택
이 예제에서는 chan
매개 변수를 받아들이는 goroutine (별도의 스레드에서 실행되는 함수)을 작성하고 매번 채널로 정보를 보내는 루프 만 수행합니다.
main
에는 for
루프와 select
있습니다. select
는 case
문 중 하나가 true가 될 때까지 처리를 차단합니다. 여기서 우리는 두 가지 경우를 선언했다. 첫 번째는 정보가 채널을 통해 오는 경우이고 다른 하나는 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)
}
}
}
select with timeouts 사용
그래서 여기에서 for
루프를 제거하고 3 초 후에 반환하는 select
두 번째 case
를 추가하여 시간 초과 를 만들었습니다. 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