본문 바로가기

Backend/Golang

(9)
Go 언어 - [8장] (실무 패턴) ※ 디스커버리 Go 언어 라는 책 내용을 전반적으로 다루지만 책 리뷰보다는 좀 더 간단하게 정리해보겠습니다. 8. 실무 패턴 이번 장에서는 실무에서 맞닥뜨리는 설계 문제들을 어떻게 풀 수 있는지 보도록 하겠습니다. 예를 들면, Go 언어에서는 제네릭 프로그래밍을 지원하지 않는데, 이를 어떻게 흉내낼 수 있는지 아는 것보다 제네릭으로 어떤 문제를 풀고 싶은지가 더 중요합니다. 이렇게 생각하면 굳이 제네릭을 이용하지 않아도 되는 경우가 많습니다. 8.1 오버로딩 오버로딩은 같은 이름의 함수 및 메서드를 여러 개 둘 수 있는 기능인데, Go 언어에서는 지원되지 않습니다. 어떤 경우에 오버로딩이 필요한지 생각해보겠습니다. - 자료형에 따라 다른 이름 붙이기 : 오버로딩을 반드시 하지 않아도 되는 경우가 많으며,..
Go 언어 - [7장 - (2)] (동시성) ※ 이전 내용에 이어서 7장의 나머지 부분을 정리해보겠습니다. 7.3.6 파이프라인 중단하기 파이프라인을 구성할 때, 받기만 할 뿐 그만 보내달라고 요청할 수 없었습니다. 채널에서 받다가 끝까지 받지 않고 break 등으로 빠져나온다면, 보내는 쪽에서 채널이 막히게 되고 이 고루틴은 종료되지 않고 계속 막혀있게 됩니다. 채널이 닫힐 때까지 자료를 모두 빼주어야 종료되면서 고루틴이 소멸됩니다. 모두 자료를 소진시키지 않으면 해제되지 않은 고루틴들이 메모리에 남아 누수를 일으킵니다. 모든 자료를 소진시킨다해도 그만큼 계속 데이터를 받아오면 더 많은 네트워크 트래픽과 배터리 소모가 발생할 것입니다. 채널을 억지로 닫아버린다면 패닉이 발생하기에 보내는 쪽에서만 닫는것으로 패턴을 정형화해야 합니다. 유용한 패턴 ..
Go 언어 - [7장 - (1)] (동시성) ※ 디스커버리 Go 언어 라는 책 내용을 전반적으로 다루지만 책 리뷰보다는 좀 더 간단하게 정리해보겠습니다. 7장은 내용이 길어서 두개의 포스팅으로 나눠서 작성하겠습니다. 7. 동시성 이번 장에서는 동시성에 대한 개념을 알아보고 구현하며, 동시성을 이용하면 좋은 경우와 패턴들 또한 보도록 하겠습니다. 7.1 고루틴 고루틴은 가벼운 스레드와 같은 것으로 현재 수행 흐름과 별개의 흐름을 만들어주며, 생성 방법은 간단합니다. f(x, y, z) // 일반적인 함수 호출 go f(x, y, z) // 고루틴 호출 앞에 go 를 붙여서 함수를 호출하게 되면 f(x, y, z) 의 호출과 현재 함수의 흐름은 메모리를 공유하는 논리적으로 별개의 흐름이 됩니다. 7.1.1 병렬성과 병행성 물리적으로 별개의 흐름이랑 동..
Go 언어 - [6장] (웹 어플리케이션 작성) ※ 디스커버리 Go 언어 라는 책 내용을 전반적으로 다루지만 책 리뷰보다는 좀 더 간단하게 정리해보겠습니다. 6. 웹 어플리케이션 작성 이번 장에서는 간단한 웹 앱을 만들어보겠습니다. 6.1 Hello, World! func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, World!") }) log.Fatal(http.ListenAndServe(":8080", nil)) } 웹 앱에서는 위처럼 아주 간단한 코드로 Hello, Wrold 를 찍을 수 있습니다. 브라우저에서 http://localhost:8080 주소를 열어 확인 가능합니다. 6.2 할 일 목록 관리 웹 앱 ..
Go 언어 - [5장] (구조체) ※ 디스커버리 Go 언어 라는 책 내용을 전반적으로 다루지만 책 리뷰보다는 좀 더 간단하게 정리해보겠습니다. 5. 구조체 구조체는 필드들을 묵어놓은 것으로 다른 언어들의 구조체, 클래스, 레코드 등과 비슷한 역할을 하며 구조체를 이용하면 더 복잡한 자료형을 정의할 수 있습니다. 인터페이스는 구현은 없고 메서드의 형태만 있는 메서드의 집합입니다. 이번 장에서는 구조체와 인터페이스 이 두가지에 대해 알아보도록 하겠습니다. 5.1.1 구조체 사용법 구조체 자료형으로 된 변수 하나를 선언해보겠습니다. // 1 var task = struct { title string done bool due *time.Time }{"laundry", false, nil} // 2 type Task struct { title S..
Go 언어 - [4장] (함수) ※ 디스커버리 Go 언어 라는 책 내용을 전반적으로 다루지만 책 리뷰보다는 좀 더 간단하게 정리해보겠습니다. 4. 함수 코드의 덩어리를 만든 후 그 덩어리를 호출하고 귀환할 수 있는 구조를 서브루틴이라고 하는데, Go 에서는 이 서브루틴을 함수라고 부릅니다. Go 에서는 값에 의한 호출 (Call by value) 만을 지원합니다. 함수 내에서 넘겨받은 변수값을 변경하더라도 함수 밖의 변수에는 영향을 주지 않습니다. 따라서 함수 밖의 값을 변경하려면 주소값을 넘겨받아 참조에 의한 호출 (Call by reference) 과 비슷한 효과를 낼 수 있습니다. 이번 장에서는 함수에 대한 여러가지들을 보도록 하겠습니다. 4.1 값 넘겨주고 넘겨받기 4.1.1 값 넘겨 주기 func ReadFrom(r io.Re..
Go 언어 - [3장] (문자열 및 자료구조) ※ 디스커버리 Go 언어 라는 책 내용을 전반적으로 다루지만 책 리뷰보다는 좀 더 간단하게 정리해보겠습니다. 3. 문자열 및 자료구조 이번 장에서는 문자열 처리, 배열과 슬라이스, 맵과 같은 자료구조, 기본적인 입출력에 대해 보도록 하겠습니다. 3.1 문자열 문자열은 바이트들이 연속적으로 나열되어 있는 것이며, Go 에서는 string 자료형을 이용합니다. 바이트들의 연속을 나타내는 다른 방식으로 []byte 는 변경이 가능하지만, string 은 읽기 전용입니다. 3.1.1 유니코드 처리 Go 언어의 소스 코드는 UTF-8 로 되어 있고, 코드 상에 표시된 문자열 역시 UTF-8 로 인코딩되어 있습니다. for i, r := range "가나다" { fmt.Println(i, r) } fmt.Print..
Go 언어 - [2장] (Go 환경 설정) ※ 디스커버리 Go 언어 라는 책 내용을 전반적으로 다루지만 책 리뷰보다는 좀 더 간단하게 정리해보겠습니다. 2. 환경 설정하기 2.1 설치하기 맥에서 homebrew 를 통해 golang 을 설치해보도록 하겠습니다. 먼저 터미널에서 brew install golang 을 입력합니다. > brew install golang 설치는 금방 완료됩니다. 이후 터미널에서 go version / go / go env 등의 명령어를 입력했을때 아래처럼 잘 나오면 설치는 성공입니다. > go version go version go1.14.6 darwin/amd64 이제 GOROOT / GOPATH / PATH 설정을 확인하고, 필요하면 추가해보겠습니다. GOROOT : Go 를 설치했을 때 Go 관련된 실행파일, S..