이 글은 골든래빗 《Tucker 의 Go 언어프로그래밍》의 2단계 써머리입니다.
목차
- 에러 핸들링
- 고루틴과 동시성 프로그래밍
- 채널과 컨텍스트
- 단어 검색 프로그램
에러 핸들링
에러 생성하기
import "fmt"
fmt.Errorf("에러 메시지")
// 에러 메시지 생성
=====
import "errors"
errors.New("에러 메시지")
// 에러 생성
에러 타입
type error interface {
Error() string
}
패닉 panic()
- 프로그램을 바로 종료시켜서 문제 발생 시점 및 발생한 경로 파악
recover()
- 프로그램 복구 (제한적 사용 필요)
- 데이터가 비정상적으로 저장된 상태인 경우가 있음 (다른 오류 발생하지 않도록 사용)
고루틴과 동시성 프로그래밍
고루틴 (Go Routine)
→ 경량 쓰레드
→ go 함수()
var wg sync.WaitGroup
wg.Add(3) // 작업 개수 설정 (대기해야하는 개수)
wg.Done() // 작업이 완료될 때마다 호출 (고루틴)
wg.Wait() // 모든 작업이 완료될 때까지 대기
채널과 컨텍스트
채널 (channe)
- 고루틴간끼리 메세지를 전달할 수 있는 메세지 큐(FIFO: 입력한 순서대로 쌓임) == thread-safe queue
- 동시성 프로그래밍을 도와주는 기능
- Mutex없이 동시성 프로그래밍 가능
- chan: 채널 타입
- 채널 기본 크기 = 0
채널 인스턴스 생성
- 채널 사용하기위해 생성
- make()함수 생성
- var 채널인스턴스변수명 chan 채널타입 = make(chan 메세지타입)
채널에 데이터 넣기
- 채널인스턴스 <- "넣을 데이터"
- <- 연산사 이용 (채널 인스턴스를 가리킴)
채널에서 데이터 빼기
- var 빼낸데이터를담을변수 타입 <- "채널인스턴스
- <- 연산사 이용 (빼낸 데이터를 담을 변수를 가리킴)
- 데이터를 빼올 때 채널 인스턴스에 데이터가 없으면 데이터가 들어 올 때까지 대기
버퍼(buffer)
- 내부에 데이터를 보관할 수 있는 메모리 영역
select문
- 여러 채널을 동시에 대기하고 싶을 때 사용
select {
case n := <-ch1:
... // ch1채널에서 데이터를 빼낼수 있을 때 실행
case n2 := <-ch2:
... // ch2채널에서 데이터를 빼낼수 있을 때 실행
}
컨텍스트(context)
- 동시성 프로그래밍을 도와주는 기능
- 고루틴에 작업을 요청할 때 작업 취소나 작업 시간 등을 설정할 수 있는 작업 명세서 역할
- 특정 데이터를 전달하거나 특정 시간 동안만 작업을 요청하거나 작업 도중에 작업 취소를 요청
- context패키지에서 제공하는 기능
- 작업을 지시할 때 작업 가능 시간, 작업 취소 등의 조건을 지시할 수 있는 작업 명세서 역할
- 새로운 고루틴으로 작업을 시작할 때 일정 시간 동안만 작업을 지시하거나 외부에서 작업을 취소 할 때 사용
- 작업 설정에 관한 데이터 전달 가능
취소가능한 컨텍스트
- ctx, cancel := context.WithCancel(context.Background())
작업 시간을 설정한 컨텍스트
- ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
특정값을 설정한 컨텍스트
- ctx := context.WithValue(context.Background(), "key", "value")
'STUDY > Go Lang' 카테고리의 다른 글
[3단계] Go 프로그래밍에 유용한 기법 익히기 (2) (0) | 2023.11.13 |
---|---|
[3단계] Go 프로그래밍에 유용한 기법 익히기 (1) (0) | 2023.11.05 |
[GoLang] 고급 기법으로 Go 레벨업하기 (1) (1) | 2023.10.22 |
[GoLang] 가볍게 Go 입문하기 (2) (1) | 2023.10.15 |
[GoLang] 가볍게 Go 입문하기 (1) (0) | 2023.10.07 |