STUDY/Go Lang

[Go Lang] 고급 기법으로 Go 레벨업하기 (2)

Jexists 2023. 10. 29. 21:22

 

이 글은 골든래빗 《Tucker 의 Go 언어프로그래밍》의 2단계 써머리입니다.

목차

  1. 에러 핸들링
  2. 고루틴과 동시성 프로그래밍
  3. 채널과 컨텍스트
  • 단어 검색 프로그램

에러 핸들링

에러 생성하기

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")