약간 멍청하게 생긴 golang 마스코트
Golang의 백엔드 프로그래밍을 하기 위해 아래 조건을 갖춘 프로그램을 개발하기로 했다.
5초 마다 http get 호출
1초 이상 http get이 지연되었을 경우 timeout 발생
Golang의 timeout을 사용 - select와, channel 활용
(Golang의 특징, timeout 설명 페이지 바로가기)
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package main import ( "fmt" "time" "net/http" "io/ioutil" ) func main(){ for { fmt.Println("Http request start") c1 := make(chan string, 1) // get response를 가져오기 위한 channel 생성 go func() { resp, err := http.Get("https://github.com/") // github사이트 get호출 if err != nil { panic(err) } defer resp.Body.Close() data, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) // 에러 경우 panic 발생 } c1 <- string(data) // 정상적으로 get호출 되었을 경우 channel에 body값 넣기 }() select { case result := <-c1: fmt.Println(result) case <-time.After(1 * time.Second): // 1초 timeout 설정, 1초 이내에 get호출 못하면 timeout 발생 fmt.Println("HTTP request timeout") } time.Sleep(5000 * time.Millisecond) // 5초마다 for구문이 돌도록 delay } } | cs |
결과물
- 네트워크 상태에 따라 timeout / 혹은 성공하는 모습을 볼 수 있다.
- 첫번째 시도는 timeout, 두번째 시도에서 200 OK로 받아오는 모습을 볼 수 있다.
End of Document
반응형
'Programming Language > golang' 카테고리의 다른 글
goroutine 함수 여러번 실행 결과값 기다리는 2가지 방법 - js callback 처럼 (1) | 2023.03.03 |
---|---|
go gin framework graceful shutdown 예제 (0) | 2023.03.03 |
intellij에서 golang 프로젝트 인식이 잘 안될때 (0) | 2023.02.22 |
golang 동시성 예제 (0) | 2021.03.22 |
Golang의 독특한 특징 3가지 - A declared are not used, Multiple return values, Timeout (1102) | 2018.05.20 |
Jetbrains사의 GoLand로 Go언어 시작하기 (1108) | 2018.05.20 |