>  기사  >  백엔드 개발  >  Golang에서 switch문과 select문의 사용법에 대한 자세한 설명

Golang에서 switch문과 select문의 사용법에 대한 자세한 설명

零下一度
零下一度원래의
2017-06-29 15:30:281908검색

이 글에서는 Golang의 switch 및 select 사용법을 주로 소개합니다. 이 글에서는 샘플 코드를 통해 switch 문 및 select 문 사용법을 자세히 소개합니다. 이는 모두에게 필요한 참고 자료입니다. 친구 여러분, 편집자를 따라와 함께 배워보세요.

이 글은 주로 Golang의 switch 및 select 사용법에 대한 내용을 소개합니다. 자세한 소개를 살펴보겠습니다.

1. switch 문 다중 분기 조건부 실행 방법을 제공합니다. 각 케이스에는
expression

또는 유형 지정자가 포함될 수 있습니다. 전자는 케이스 표현이라고도 할 수 있습니다. 따라서 Go 언어의 스위치 문은 표현식 스위치 문과 유형 스위치 문으로 구분됩니다.


1. 표현식 스위치 문

var name string 
... 
switch name { 
case "Golang": 
 fmt.Println("Golang") 
case "Rust": 
 fmt.Println("Rust") 
default: 
 fmt.Println("PHP是世界上最好的语言") 
}

Go는 표현식이 스위치 표현식과 일치하는 것으로 확인되는 한 각 케이스 문의 케이스 표현식을 위에서 아래로 평가합니다. 동일하면 사례 설명이 선택됩니다. 나머지 사례 설명은 무시됩니다. if와 마찬가지로 switch 문에도 초기화 단어가 포함될 수 있으며 그 모양과 작성은 완전히 동일합니다.

names := []string{"Golang","java","PHP"} 
switch name:=names[0];name { 
case "Golang": 
 fmt.Println("Golang") 
... 
default: 
 fmt.Println("Unknown") 
}


2 Type switch 문

type switch 문과 일반 문에는 두 가지 차이점이 있습니다. 형태. 첫 번째 요점은 case 키워드 뒤에 오는 것이 표현식이 아니라 유형 지정자라는 것입니다. 유형 지정자는 여러 유형 리터럴로 구성되며 여러 유형 리터럴은 쉼표로 구분됩니다. 두 번째 요점은 스위치 표현이 매우 특별하다는 것입니다. 이 특수 표현식은 유형 주장의 역할도 하지만 해당 표현식은 v.(type)처럼 매우 특별합니다. 여기서 v는 인터페이스
유형 값입니다. 이 유형의 표현식은 type switch 문에만 나타날 수 있으며 스위치 표현식으로만 사용될 수 있습니다. type switch 문의 예는 다음과 같습니다.

v.(type) , 其中v必须代表一个接口类型的值。该类表达式只能出现在类型switch语句中,且只能充当switch表达式。一个类型switch语句的示例如下:


v := 11 
switch i := interface{}(v).(type) { 
case int, int8, int16, int32, int64: 
 fmt.Println("A signed integer:%d. The type is %T. \n", v, i) 
case uint, uint8, uint16, uint32, uint64: 
 fmt.Println("A unsigned integer: %d. The type is %T. \n", v, i) 
default: 
 fmt.Println("Unknown!") 
}

我们这里把switch表达式的结果赋给了一个变量。如此以来,我们就可以在该switch语句中使用这个结果了。这段代码被执行后,输出:"A signed integer:11. The type is int.

ch1 := make (chan int, 1) 
ch2 := make (chan int, 1) 
 
... 
 
select { 
case <-ch1: 
 fmt.Println("ch1 pop one element") 
case <-ch2: 
 fmt.Println("ch2 pop one element") 
}

여기서는 스위치 표현식의 결과를 변수에 할당합니다. 이런 방식으로 이 결과를 switch 문에 사용할 수 있습니다. 이 코드가 실행된 후 출력은 다음과 같습니다: "부호 있는 정수:11. 유형은 int입니다. "


마지막으로 fallthrough에 대해 이야기해 보겠습니다. 이는 키워드이자 명령문을 나타낼 수 있습니다. fallthrough 문은 표현식 switch 문 내의 case 문에 포함될 수 있습니다. 그 기능은 제어를 다음 케이스로 전달하는 것입니다. 그러나 fallthrough 문은 Case 문에서 마지막 문으로만 표시될 수 있다는 점에 유의하세요. 게다가 이를 포함하는 Case문은 자신이 속한 switch문의 마지막 Case문이 아닙니다.

2. Select 문


Golang의 select 기능은 IO 작업을 모니터링하고 IO 작업이 발생할 때 해당 작업을 트리거하는 select, poll, epoll과 유사합니다.

예:


timeout := make(chan bool, 1) 
go func() { 
 time.Sleep(time.Second * 10) 
 timeout <- true 
}() 
select { 
case <-pssScanResponseChan: 
 
case <-timeout: 
 fmt.PrintIn("timeout!") 
}

Select의 코드 형식은 Switch의 코드 형식과 매우 유사하지만 Select의 경우 작업 문은 [IO 작업]만 가능합니다.


이 예에서 select는 특정 사례 문이 완료될 때까지, 즉 ch1 또는 ch2에서 데이터를 성공적으로 읽을 때까지 기다립니다. select 문이 종료됩니다.


break문은 select문의 Case문에도 포함될 수 있습니다. 그 기능은 현재 select 문의 실행을 즉시 종료하는 것입니다. 자신이 속한 Case 문에 실행되지 않은 문이 있는지 여부와 관계없이 가능합니다.


【선택하여 타임아웃 메커니즘 구현】

다음과 같이

ch1 := make (chan int, 1) 
ch2 := make (chan int, 1) 
 
select { 
case <-ch1: 
 fmt.Println("ch1 pop one element") 
case <-ch2: 
 fmt.Println("ch2 pop one element") 
default: 
 fmt.Println("default") 
}
타임아웃 시간이 만료되면 케이스2가 성공적으로 작동합니다. 따라서 select 문은
exit

됩니다. ch의 읽기 작업을 항상 차단하는 대신. 이는 채널 읽기 작업에 대한 시간 초과 설정을 구현합니다.


다음은 좀 더 흥미롭습니다.

select 문에 기본값이 포함된 경우:


ch := make (chan int, 1) 
ch <- 1 
select { 
case ch <- 2: 
default: 
 fmt.Println("channel is full !") 
}

이때 ch1과 ch2가 모두 비어 있으므로 case1과 case2 모두 성공적으로 읽히지 않습니다. 그런 다음 선택은 기본 문을 실행합니다.


이 기본 기능으로 인해 select 문을 사용하여 chan이 꽉 찼는지 여부를 감지할 수 있습니다.

는 다음과 같습니다.


flag := false 
for { 
 select { 
 case <-pssScanResponseChan: 
 continue 
 default: 
 flag = true 
 } 
 if true == flag { 
 break 
 } 
}

1을 삽입할 때 ch가 이미 꽉 찼기 때문입니다. ch가 2를 삽입하려고 할 때 ch가 꽉 찬 것을 발견하면(case1이 차단됨) select가 기본 문을 실행합니다. 이런 방식으로 항상 기다리지 않고 채널이 가득 찼는지 여부를 감지할 수 있습니다.


예를 들어 서비스가 있는 경우 요청이 들어오면 작업을 생성하여 채널에 던지고, 다른 코루틴은 실행을 위해 채널에서 작업을 가져옵니다. 하지만 채널이 숨겨지면 작업을 포기하고 [서비스가 사용 중입니다. 나중에 다시 시도해 주세요. ] 이 요구 사항을 충족하려면 선택을 사용할 수 있습니다. 🎜🎜

此外,利用default特性,我们可以使用select语句将chan清空,如下:


flag := false 
for { 
 select { 
 case <-pssScanResponseChan: 
 continue 
 default: 
 flag = true 
 } 
 if true == flag { 
 break 
 } 
}

위 내용은 Golang에서 switch문과 select문의 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.