예제로 살펴보는 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 : 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초 간격으로 채널로 부터 메시지를 받아서 코드를 실행...

예제로 살펴보는 Go : 타이머 

Go에서 제공하는 time 패키지의 NewTimer메서드를 호출하면, 채널을 반환한다. NewTimer는 설정된 시간이 지난 후 채널에 메시지를 보내는데, 이를 이용해서 타이머를 구현 할 수 있다. 2초 후에 메시지를 전달하는 채널 데이터 timer1을 만들었다. 이 코드는 <-timer1.C에서 블럭된다. 2초 후 타이머가 작동해서 메시지를 수신하면 블럭...

예제로 살펴보는 Go : Range over Channels 

for & range 를 이용해서 채널을 체크 할 수 있다.string 메시지타입의 크기가 2인 채널을 만들었다. 여기에 두 개의 메시지를 전송하고 채널을 close 했다. 채널을 close 한다고 해서 즉시, 채널을 close하는 건 아니다. 채널이 비워진 후에 비로서 close 된다. for & range 문을 이용해서 채널로 부터 메시지를 읽는다. 채...

예제로 살펴보는 Go : 채널 닫기 

채널을 이용해서 worker 고루틴에 작업 메시지를 보낸다고 가정해 보자. 만약 더 이상 작업이 없다면, worker고루틴을 종료해야 할 것이다. 이를 위해서 worker는 더 이상 메시지가 없음을 측정 할 수 있어야 한다. 아래 예제를 보자.예제 프로그램의 main() 고루틴은 jobs채널을 이용해서 worker 고루틴과 통신을 한다. main 고루틴은 ...