본문 바로가기

Language/Go40

Effective Go - Concurrency - 2 - 출처: https://go.dev/doc/effective_go#channels - Channels channel은 map처럼 make 문법을 통해서 할당하며 결과값은 데이터 구조에 대한 참조 역할을 한다. 만약 2번째 인자로 integer parameter를 주면 channel에 대한 버퍼 사이즈를 설정한다. 기본값은 0이며, 0이면 버퍼를 갖지 않는(unbuffered) 동기화 channel을 의미한다. ci := make(chan int) // unbuffered channel of integers cj := make(chan int, 0) // unbuffered channel of integers cs := make(chan *os.File, 100) // buffered channel of.. 2022. 6. 1.
Effective Go - Concurrency - 1 - 출처: https://go.dev/doc/effective_go#concurrency - Share by communicating 동시성 프로그래밍은 매우 방대한 주제이다. 동시성 프로그래밍은 공유 변수에 대한 정확한 접근을 구현하기 위해 요구되는 미묘한 부분 때문에 어려운 주제이기도 하다. Go 언어는 공유되는 값들이 channel 이라는 개념을 통해 전달되고, 실제로는 실행되는 각 스레드들에서 공유가 활성화되지 않는 색다른 접근방식을 제안한다. 어느 시점에서든 하나의 값에는 하나의 goroutine만 접근이 가능하다. 이런 설계때문에 data race가 일어나지 않는다. effective go 문서에서는 이런 사고방식을 장려하기 위해 하나의 슬로건으로 이를 요약하고 있다. Do not commun.. 2022. 6. 1.
Effective Go - Embedding - 출처: https://go.dev/doc/effective_go#embedding - Embedding Go는 일반적으로 subclassing type 개념을 제공하지는 않지만, struct나 interface 내에서 type을 embedding 하면 해당 type이 구현하는 행위들을 가져올 수 있다. Interface embedding은 매우 간단하다. 아래 코드는 io.Reader와 io.Writer 이다. type Reader interface { Read(p []byte) (n int, err error) } type Writer interface { Write(p []byte) (n int, err error) } io package는 이런 메소드들을 구현할 수 있는 객체들을 지정하는 다른 .. 2022. 5. 29.
Effective Go - Interfaces and other types - 출처: https://go.dev/doc/effective_go#interfaces_and_types - Interfaces Go에서 interface는 객체의 행동을 지정하는 방법이다. 만약 A가 B를 할 수 있다면 A는 여기에 사용될 수 있다는것을 의미한다. Go에서 1개 혹은 2개의 메소드들로 구성된 interface 들을 어렵지 않게 볼 수 있는데, Write 메소드를 구현하는 io.Writer interface 처럼 이름은 대체적으로 해당 메소드들로 부터 파생된다. 하나의 형은 여러 개의 interface들을 구현할 수 있다. 예를 들어 아래 코드에서 Sequence는 Len(), Less(i, j int) bool, Swap(i, j int)를 포함하는 sort.Interface를 구현하는.. 2022. 5. 26.
Effective Go - Methods - 출처: https://go.dev/doc/effective_go#methods - Methods 메소드는 포인터나 인터페이스를 제외하고 명명된 유형에 대해 정의될 수 있다. 즉 Receiver가 반드시 구조체가 아니어도 된다. 예를 들어 Append라는 함수를 slice의 메소드로 정의할 수 있는데, 이렇게 하기 위해서는 우선 메소드를 묶을 수 있도록 명명된 유형을 정의해야 한다. 그리고 Receiver로 해당 형을 기술해준다. type ByteSlice []byte func (slice ByteSlice) Append(data []byte) []byte { // Body exactly the same as the Append function defined above. } 위의 메소드는 갱신된 sli.. 2022. 5. 17.
Effective Go - Array and Slice - 출처: https://go.dev/doc/effective_go#arrays - Arrays Go에서 Arrays는 주로 slice를 위한 block을 할당하는데 사용된다. Go와 C에서 array가 동작하는 방식의 주요 차이점은 아래와 같다. Arrays는 value 이므로 하나의 array를 다른 array에 할당하면 모든 요소들이 복사된다. 특히 array는 함수에 넘기면 함수는 해당 array의 pointer가 아니라 array의 복사본을 받는다. Array의 크기는 해당 type의 요소이므로 [10]int와 [20]int은 다르다. Value 특성은 유용하게 사용되긴 하지만 비용이 크다. 만약 C와 동일한 동작방식과 효율성을 원한다면 아래 코드처럼 array에 대한 pointer를 넘길 수 .. 2022. 5. 8.
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.
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.