English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Go 언어에서 select 문은switch 문하지만 select 문에서 case 문은 통신을 의미하며, 즉 채널 상의 전송이나 수신 작업을 의미합니다.
문법:
select{ case SendOrReceive1: // 문 case SendOrReceive2: // 문 case SendOrReceive3: // 문 ...... default: // 문
중요 사항:
Select 문은 통신(전송이나 수신 작업)이 준비되면 대기하고, 특정 경우에서 시작하도록 설계되었습니다.
package main import ( "fmt" "time" ) // 함수 1 func portal1(channel1 chan string) { time.Sleep(3 * time.Second) channel1 <- "환영합니다 채널 1" } // 함수 2 func portal2(channel2 chan string) { time.Sleep(9 * time.Second) channel2 <- "환영합니다 채널 2" } func main() { // 채널 생성 R1 := make(chan string) R2 := make(chan string) // goroutine를 사용하여 함수 호출1과 함수2 go portal1(R1) go portal2(R2) select { // case 1 case op1 := <-R1: fmt.Println(op1) // case 2 case op2 := <-R2: fmt.Println(op2) } }
출력:
환영합니다 채널에 오셨습니다 1
용법 설명:위의 프로그램에서, portal1sleep3초, portal2sleep9seconds, after their sleep time ends, they will be ready to continue. Now, the select statement waits for their sleep time, when portal2awake, then it chooses case 2그리고 "환영합니다 채널"을 출력 1". 만약 포털1in portal2이전에 깨워졌다면, "환영합니다 채널"이 출력됩니다 2”。
select 문구에 아무도 case가 없으면, 그 select 문구는 영원히 기다립니다.
문법:
select{}
package main func main() { //아무도 case가 없으면, 영원히 기다립니다 select{ } }
출력:
fatality error: all goroutines are asleep - deadlock! goroutine 1 [select (no cases)]: main.main() /home/runner/main.go:9 +0x20 종료 상태 2
select 문구의 default 문구는 select 문구가 블록되지 않도록 보호합니다. 아무도 준비되지 않은 경우, 이 문구를 실행합니다.
package main import "fmt" func main() { //채널 생성 mychannel := make(chan int) select { case <-mychannel: default: fmt.Println("Not found") } }
출력:
Not found
select 문구의 블록은, 아무도 준비되지 않은 case 문구가 있지 않으며 select 문구에 기본 문구가 포함되지 않았을 때, select 문구가 블록됩니다. 이 때, 최소한 하나의 case 문구나 통신이 가능해지면 계속될 수 있습니다.
package main func main() { //채널 생성 mychannel := make(chan int) //채널이 준비되지 않았습니다 //그리고 기본 문구가 없습니다 select { case <-mychannel: } }
출력:
fatality error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main() /home/runner/main.go:14 +0x52 종료 상태 2
select 문구에서 여러 상황을 처리할 준비가 되어 있다면, 임의로 그 중 하나를 선택할 수 있습니다.
package main import "fmt" //함수 1 func portal1(channel1 chan string){ for i := 0; i <= 3; i++{ channel1 <- "환영합니다 채널 1" } } //함수 2 func portal2(channel2 chan string){ channel2 <- "환영합니다 채널 2" } func main() { //채널 생성 R1:= make(chan string) R2:= make(chan string) //goroutine 방식으로 함수 호출1그리고2 go portal1(R1) go portal2(R2) //임의로 선택하십시오 select{ case op1:= <- R1: fmt.Println(op1) case op2:= <- R2: fmt.Println(op2) } }
출력:
환영합니다 채널에 오셨습니다 2