본문 바로가기

Go46

Effective Go - New 와 Make - 출처: https://go.dev/doc/effective_go#data - New Go에서 할당에 관한 primitive에는 new와 make 2 가지 built-in 함수가 존재한다. new는 메모리를 할당한다. 다른 언어의 new와는 다르게 메모리를 초기화하지 않고, 단순히 "zero"화 한다. new(T) 는 T형의 새로운 요소를 위해 zero화된 공간을 할당하고, type *T 값인 해당 주소를 반환한다. Go 용어로 type T의 새롭게 할당된 zero 값에 대한 pointer를 반환한다. new에 의해 반환된 메모리가 zero화 되기 때문에, 추가적인 초기화 없이 각 type의 zero값이 사용될 수 있는 data 구조를 설계할 때 유용하다. 이를 잘 사용할 경우 해당 data 구조를 사.. 2022. 5. 7.
Effective Go - Functions - 출처: https://go.dev/doc/effective_go#functions - Multiple return values Go의 특이한 점중 하나는 함수와 메소드가 여러 값을 반환할 수 있다는 것이다. Go 에서 Write 메소드는 count과 error를 반환하는데 이 덕분에 "일부 bytes를 쓰긴했지만 어떤 error 때문에 전부 쓴것은 아니다."와 같은 정보를 알 수 있게 된다. os package의 Write 메소드 시그니처를 살펴보자. func (file *File) Write(b []byte) (n int, err error) 위의 함수는 n != len(b) 일 때 쓰여진 byte의 수와 nil이 아닌 error를 반환한다. Go에서는 이런 형태를 많이 사용하고 있다. multip.. 2022. 5. 7.
gRPC with protobuf - 출처: https://grpc.io/docs/what-is-grpc/introduction/ - 출처: https://grpc.io/docs/languages/go/quickstart/ - 출처: https://github.com/grpc/grpc-go/tree/master/examples/helloworld - 개요 google에서 개발한 Remote Procedure Call이다. IDL(Interface Definition Language) 및 기본 메시지 교환형식으로 protocol buffer를 사용할 수 있다. RPC와 비슷하게 서버측에서는 interface를 구현하고 gRPC 서버를 실행하면 클라이언트에서는 서버와 같은 메소드의 stub을 갖는 구조이다. gRPC는 여러 언어를 지원하는데.. 2022. 3. 13.
RPC(Remote procedure call) - 출처: https://en.wikipedia.org/wiki/Remote_procedure_call#Analogues - 출처: https://pkg.go.dev/net/rpc - RPC란 무엇인가 gRPC에 관해 알아보기 전에 RPC란 개념부터 알아보기로 하자. RPC란 Remote procedure call 의 약자이다. 다른 주소공간(일반적으로는 같은 네트워크를 공유하는 다른 컴퓨터)의 procedure를 실행할 때, 원격 세부사항에 관한 명시적인 코딩없이 마치 local 컴퓨터의 procedure를 호출하는것처럼 사용하는 방식이다. OOP에서는 RMI(Remote method invocation)으로 표현하기도 한다. Go에서는 package rpc를 제공하며 Java에서는 Java RMI를 .. 2022. 3. 13.
Go - Reading files - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/reading-files - test-double: https://tecoble.techcourse.co.kr/post/2020-09-19-what-is-test-double/ - 개요 이번 챕터에서는 file을 읽고 데이터를 얻는 방법에 대해 알아본다. 만약 친구와 blog 소프트웨어를 만든다고 가정해보자. 저자들은 게시물을 markdown으로 작성하며 file의 상단에는 메타데이터가 존재한다. 시작시에 웹서버는 게시물을 생성하기 위해 folder를 읽고, 별도의 NewHandler 함수가 해당 게시물들을 blog의 웹서버를 위한 데이터소스로서 사용할것이다. - Example blog .. 2022. 3. 13.
Go - Context - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/context - 출처: https://pkg.go.dev/context - 출처: https://go.dev/blog/context - 출처: https://faiface.github.io/post/context-should-go-away-go2/ - Context Software를 구축하다보면 긴 생명주기를 갖거나 자원 집약적인 process들을 실행시켜야 하는 경우가 있다. 어떤 이유에 의해 이런 행위를 발생시킨 요청이 취소되거나 실패한 경우, application을 통해 일관된 방식으로 이런 프로세스들을 멈추도록 해야 한다. 이런 조치를 취하지 않으면 성능 문제를 디버깅 하느라 상.. 2022. 2. 27.
Go - Sync - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/sync - 개요 병렬 프로세스에 안전한(thread-safe) counter를 만들어본다. single-thread에서 동작하는 counter를 만들고 난 후, 여러 개의 goroutine으로 unsafe함을 확인하고 Sync를 이용해서 이를 고쳐보자. race condition을 해결하기 위한 Mutex도 사용해본다. - Counter Counter를 증가시키는 메소드와 Counter의 값을 반환하는 메소드를 만들었다고 가정한 후 test 코드를 작성해보자. func TestCounter(t *testing.T) { t.Run("incrementing the counter 3 time.. 2022. 1. 20.
Go - reflection - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/reflection - 개요 reflect package에 대해 알아본다. struct x을 받고 fn을 호출해서 재귀적으로 내부의 string field들을 모두 순회하는 함수 walk(x interface{}, fn func(string))를 작성해보자. 이번 챕터에서는 이 요구사항을 구현하기위해 reflection을 사용해볼것이다. - interface 여태까지는 string, int 형 처럼 Go에서 제공하거나, BankAccount와 같이 형을 정의한 type-safety만 다루었다. 그래서 참조할 문서를 쉽게 찾을 수 있었고, 만약 잘못된 형을 함수에 넘기면 컴파일러가 이를 미.. 2022. 1. 15.
Go - select - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/select - 개요 http 요청 test를 작성하는법을 알아본다. goroutine 사용시 동기화를 위해 select를 이용해본다. - WebsiteRace example 두 URL을 받아서 HTTP GET 요청을 날렸을 때 먼저 응답한 URL을 반환하는 WebsiteRace 함수를 작성해보자. 만약 두 URL 모두 10초내로 답변이 없으면 error를 반환한다. 우선 요구사항에 맞게 간단하게 test 코드를 작성해보자. func TestRacer(t *testing.T) { slowURL := "http://www.facebook.com" fastURL := "http://www.q.. 2022. 1. 12.
Go - Concurrency - 출처: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/concurrency - 개요 Go의 병렬 프로그래밍인 concurrency(go 문법)에 대해 알아보자. goroutine과 channel을 사용해본다. - CheckWebsites 예제 아래와 같이 URL 들의 응답 상태를 확인하는 CheckWebsites 함수가 있다고 하자. package concurrency type WebsiteChecker func(string) bool func CheckWebsites(wc WebsiteChecker, urls []string) map[string]bool { results := make(map[string]bool) for _, url :.. 2022. 1. 4.