예제로 살펴보는 Go : Defer

Defer은 코드가 종료된 뒤에 수행할 함수를 설정하기 위해서 사용한다. 자원을 정리(cleanup)하기 위한 목적으로 주로 사용한다. 다른 언어의 encure와 finally와 비슷한 일을 한다.이 프로그램은 파일을 /tmp 디렉토리에 파일을 만들고, 간단한 문자열을 쓴 다음에 닫는 일을 한다. 10번째 줄에 defer를 이용해서 closeFile() 함...

예제로 살펴보는 Go : Panic

panic은 예상치 못한 문제가(unexpected errors) 발생 했음을 알려주기 위해서 사용한다. 보통 우아하게(gracefully)하게 처리할 수 없는 치명적인 에러에 대해서 즉시 처리 하기 위해서 사용한다.예제는 panic()함수를 이용해서, 예상치 못한 문제의 발생을 시뮬레이션했다. panic()은 에러를 평가 할 수 없을 때, 기능을 아예 중...

예제로 살펴보는 Go : Sorting by Functions

프로그램을 만들다 보면, 내장된 sort 패키지로는 원하는 정렬을 할 수 없을 때가 있다. 예를 들어 문자열을 알파벳 순서가 아닌 문자열의 길이로 정렬해야 한다면, custom 함수를 구현해야 한다. Custom 정렬 함수를 만들기 위해서는 그에 맞는 타입을 준비해야 한다. 예제에서는 string 타입의 alias인 ByLength타입을 만들었다. 이제 s...

예제로 살펴보는 Go : Sorting

Go 언어의 sort 패키지를 이용해서 내장 자료와 유저 정의 자료를 정렬할 수 있다. 먼저 내장 자료를 정렬하는 것을 살펴보자.string 배열과 int형 배열을 정렬하는 간단한 예제로 In-place(제자리) 정렬이기 때문에, 정렬된 값을 반환하지 않는다. sort.Strings()으로 string 슬라이스를, sort.Ints로 int형 슬라이스를 정...

예제로 살펴보는 Go : Stateful Goroutines

앞의 예제에서는 뮤텍스를 이용해서, 여러 개의 고루틴이 공유하는 영역을 보호했다. 영역 보호는 잠금의 형식으로 이루어지기 때문에, 뮤텍스 잠금이라고 부르기도 한다. 다음 예제 ...

예제로 살펴보는 Go : Mutexes

앞 장에서 원자연산을 이용한 카운터의 구현을 살펴봤다. 여기에서는 뮤텍스(Mutex)를 이용해서 비슷한 구현을 해보려 한다. 애초에 원자적 연산은 뮤텍스를 주로 이용하니, 일반적인 방법이라고 할 수 있겠다. 뮤텍스는 자원에 대한 접근을 한번에 하나씩제어하기 위해서 사용한다. 이 코드에서 관리할 자원은 map자료구조인 state다. 뮤텍스 객체는 sync.M...

예제로 살펴보는 Go : Atomic Counter

지금까지 고루틴간 통신에는 채널을 사용했다. 실제 채널은 고루틴간 커뮤니케이션을 하기 위해서 가장 널리 사용하는 메커니즘이다. 하지만 채널외에도 사용 할 수 있는 몇 가지 옵션들이 있다. aync/atomic을 이용해서 고루틴간 atomic counter을 구현 해보도록 하자. 이 코드는 ops를 카운트 한다. 50개의 고루틴이 for 루프를 돌면서 ops...

예제로 살펴보는 Go : Rate Limiting

Rate Limitng는 주로 NIC(Network Interface Controller)에서 입력과 출력 트래픽의 양(rate)을 제어하기 하기 위해서 사용한다. 이 외에 컴퓨팅 자원을 나눠서 사용해야 하거나 QoS를 위해서 사용 한다. Go에서 제공하는 채널과 tickers를 이용하면 고루틴에 대한 Rate limiting을 손쉽게 구현할 수 있다. 9...

예제로 살펴보는 Go : Woerker pool

고루틴과 채널을 이용해서 워커풀을 만들어보자.worker 함수는 고루틴을 이용해서 cuncurrent 하게 실행한다. 작업은 jobs 채널로 받고, 결과는 results 채널로 보낸다. job 실행에 드는 비용은 time.Sleep()메서드로 시뮬레이션 했다. main() 고루틴은 jobs 채널과 results 채널을 만들고, 이들을 매개변수로 해서 wor...

예제로 살펴보는 Go : Tickers

time 패키지의 NewTicker를 이용해서 일정시간 간격으로 채널 메시지를 전달할 수 있다. 일정 간격으로 주기적으로 코드를 실행하는 프로그램 개발에 유용하게 사용 할 수 있다. time.NewTicker()메서드를 이용해서 0.5초 마다 메시지를 전송하는 채널을 만들었다. worker 고루틴은 0.5초 간격으로 채널로 부터 메시지를 받아서 코드를 실행...