반응형
context.Context
- 작업을 취소하고, 타임아웃을 설정하며, 값들을 전달하는 기능을 제공하는 표준 인터페이스
- 고루틴 간의 작업을 관리하고 조정하는 데 사용된다
주요 기능
- 취소 신호 전파:
- 작업을 취소할 수 있는 기능을 제공하여, 하나의 작업이 취소되면 관련된 모든 작업이 취소될 수 있다.
- 타임아웃 설정:
- 작업의 최대 실행 시간을 지정하여, 지정된 시간이 초과되면 자동으로 작업을 종료한다
- 값 저장 및 전달:
- 컨텍스트를 통해 값들을 저장하고, 이를 다른 함수나 고루틴에서 사용할 수 있다
주요 메서드
- Done(): 컨텍스트가 취소될 때 닫히는 채널을 반환한다
- Err(): 컨텍스트가 취소된 이유를 반환한다
- Deadline(): 컨텍스트가 작업을 완료해야 하는 시한을 반환한다
- Value(key interface{}): 컨텍스트에 저장된 값을 반환한다
주요 타입
- context.Background(): 기본 컨텍스트로, 최상위 컨텍스트로 사용된다
- context.TODO(): 아직 결정되지 않은 컨텍스트가 필요한 경우 사용된다
- context.WithCancel(parent Context): 부모 컨텍스트에서 취소할 수 있는 컨텍스트를 생성한다
- context.WithDeadline(parent Context, d time.Time): 부모 컨텍스트에서 특정 시점에 취소되는 컨텍스트를 생성한다
- context.WithTimeout(parent Context, timeout time.Duration): 부모 컨텍스트에서 일정 시간이 지나면 취소되는 컨텍스트를 생성한다
- context.WithValue(parent Context, key, val interface{}): 부모 컨텍스트에 키-값 쌍을 저장하는 컨텍스트를 생성한다
예제
- 이 예제는 2초 후에 자동으로 취소되는 컨텍스트를 생성하고, 1초 후에 작업을 완료하거나 컨텍스트가 취소되면 종료된다
package main
import (
"context"
"fmt"
"time"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
select {
case <-time.After(1 * time.Second):
fmt.Println("Completed work")
case <-ctx.Done():
fmt.Println("Context canceled:", ctx.Err())
}
}
gin.Context
- Gin 웹 프레임워크에서 HTTP 요청과 응답을 처리하는 데 사용되는 핵심 구조체
- 요청과 응답의 메타데이터, 파라미터, 쿼리 문자열, 그리고 요청 본문을 쉽게 접근하고 조작할 수 있도록 도와준다
주요 기능
- 요청 데이터 접근:
- URL 파라미터: c.Param("key")
- 쿼리 파라미터: c.Query("key")
- 폼 데이터: c.PostForm("key")
- JSON 데이터: c.ShouldBindJSON(&struct)
- 응답 데이터 설정:
- JSON 응답: c.JSON(http.StatusOK, gin.H{"key": "value"})
- HTML 응답: c.HTML(http.StatusOK, "template.html", gin.H{"key": "value"})
- 텍스트 응답: c.String(http.StatusOK, "message")
- 미들웨어 관리:
- Middleware: c.Next(), c.Abort(), c.Set(), c.Get()
- 컨텍스트 제어:
- 컨텍스트 취소: c.Request.Context().Done()
- 타임아웃 설정: c.Request.Context().Deadline()
예제
- 이 예제는 /ping 경로로 GET 요청을 처리하여 "pong" 메시지를 JSON 형태로 응답하는 간단한 서버
- gin.Context를 통해 요청 파라미터를 읽고, JSON 응답을 작성한다
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
router.Run(":8080")
}
반응형
LIST
'언어 > GO' 카테고리의 다른 글
Go 고루틴(goroutine) 정리 (0) | 2024.06.29 |
---|---|
Go 포인터 정리 (0) | 2024.06.29 |