예제로 살펴보는 Go : Channel Directions

채널은 기본적으로 양방향으로 사용할 수 있다. 반면 개발자는 채널을 읽기 전용으로 혹은 쓰기 전용으로 설정 할 수 있다. ping 함수는 쓰기 전용의 채널을 매개변수로 넘겨 받았다. 채널 pings는 쓰기만 가능하기 때문에, 읽으려고 하면 컴파일시 invalid operation에러가 발생한다. pong 함수는 읽기 전용의 채널을 매개변수로 넘겨 받았다. ...

예제로 살펴보는 Go : Errors

Go는 두 개 이상의 값을 반환할 수 있다. 이 점을 이용해서 실행결과와 에러 값을 함께 반환하는 방식으로 에러를 처리 할 수 있다. 이 방식은 상당히 직관적이다. 단지 하나의 값만을 반환하는 다른 언어들은 에러를 측정하는게 명확하지 않을 수 있다. 예를 들어 int 값을 반환하는 C 함수가 있다고 가정해 보자. 이 함수는 실패 할 경우 0을 반환한다. 그...

예제로 살펴보는 Go : Channel Synchronization

여러 개의 고루틴을 관리하다 보면, 이들을 동기화 해야 하는 필요가 생긴다. 여기에서는 고루틴이 끝날 때까지 기다리는 방법을 살펴본다.worker는 매개변수로 채널을 받는다. 소모되는 작업시간은 sleep로 대신했다. 작업이 끝나면 채널에 작업이 끝냈음을 알리는 메시지를 전송한다. main함수는 worker 고루틴을 실행하고 채널로 부터 메시지를 기다린다....

예제로 살펴보는 Go : Channel Buffering

기본적으로 채널은 unbuffered하게 만들어진다. 이것은 채널(chan <-)에 단지 하나의 데이터만 보낼 수 있음을 의미한다. 만약 채널이 데이터를 버퍼링 하기 원한다면, 채널을 만들 때 채널의 크기를 설정하면 된다.예제에서 크기가 2인 messages 채널을 만들었다. 이 message 채널은 버퍼링이 되기 때문에, 두 개의 메시지를 보낼 수 있다....

예제로 살펴보는 Go : Channels

고루틴은 코드에 동시성(concurrent)을 주기 위해서 사용한다. 두 개 이상의 코드가 실행이 되는 건데, 이 경우 코드간 통신이 중요해진다. Channels는 고루틴 간에 메시지를 주고 받기 위한 일종의 파이프다. 고루틴은 채널을 이용해서 다른 고루틴으로 데이터를 전송 할 수 있다. make(chan val-type)로 val-type의 데이터를 전송...

예제로 살펴보는 Go : Goroutines

고루틴은 실행 할 수 있는 경량 스레드(lightweight thread)다. 스레드와는 다르다. Go 언어를 사용하는 이유 중 하나다.15줄에서 f(s)함수를 동기적으로(synchronously) 호출했다. 지금까지 함수를 호출한 방법이다. 고루틴은 go를 이용해서 만들 수 있다. 고루틴으로 만들어진 코드는 마치 스레드 처럼 독립적으로 실행이 된다. 17...

예제로 살펴보는 Go : Interfaces

인터페이스(interface)는 메서드들의 이름의 집합이다. 메서드의 이름만 포함하고 있기 때문에, 구현이 필요하다. 어떤 도형의 면적과 둘레의 길이를 구하는 함수를 만든다고 가정해 보자. 도형은 삼각형, 사각형 혹은 원형이거나 다른 도형일 수도 있다. 어떤 도형이든지 이들은 면적을 구하는 area()와 둘레를 구하는 perim() 두 개의 메서드를 공통으...

예제로 살펴보는 Go : Methods

Go는 클래스를 지원하지 않는다. 대신 구조체에 메서드를 연결 하는 식으로 클래스 처럼 사용 할 수 있다.rect라는 이름의 구조체를 정의 하고 있다. 이 스트럭쳐는 width와 height 두 개의 변수를 가지고 있다.9 줄에서 rect 구조체에 대한 메서드를 정의했다. 메서드는 recever type을 이용해서 특정 구조체에 연결하는 방식으로 정의 할 ...

예제로 살펴보는 Go : Structs

Go의 스트럭쳐는 여러 개의 필드로 구성된 데이터 타입이다. 데이터의 그룹이나 레코드를 다루는데 유용하다.name과 age 두 개의 필드를 가지는 person 스트럭처를 만들었다. Go는 대부분의 객체지향 언어들이 가지는 class 키워드를 제공하지 않는다. 대신 struct를 이용해서 객체지향을 구현 할 수 있다. 객체지향을 지원하지 않는 C에서 stru...

예제로 살펴보는 Go : Pointer

Go는 포인터(pointer)를 제공한다. Go에서 모든 데이터는 값에 의한 전달(passed by value)로 작동한다. 이는 전달할 데이터를 복사한다는 의미다. 포인터는 값을 전달하지 않고, 레퍼런스(데이터가 저장된 위치)를 전달한다. 예제 코드에는 zeroval과 zeroptr이라는 두 개의 함수가 있다. 두 함수 모두 int 타입의 매개변수를 받은...