분류 전체보기333 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. Protocol buffer - Convention - 출처: https://developers.google.com/protocol-buffers/docs/style - Formatting protocol buffer 파일을 작성할 때에는 아래의 format을 따른다. 1 라인당 80 글자수 들여쓰기는 2 space string은 ""를 사용 - File 구조 File은 lower_snake_case.proto 형태를 갖는다. 파일내에 기술되는 항목의 순서는 다음과 같다. License header File overview Syntax(2, 3) Package Imports (sorted) File options 그 외 - Packages package 명은 소문자 여야 한다. - Message and field name Message: CamelCase.. 2022. 4. 29. Protocol buffer - Proto3 - 출처: https://developers.google.com/protocol-buffers/docs/proto3 - Message Type 정의 아래는 .proto 파일에 메시지를 정의한 예제이다. syntax = "proto3"; message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; } 맨 첫줄 syntax = "proto3";은 proto3 문법을 사용하겠다는것을 나타낸다. 만약 이 선언이 없다면 proto2를 사용한다고 가정한다. 위의 .proto 파일에는 SearchRequest 메시지 안에 3개의 field가 존재한다. 그리고 각 field는 이름과 형을 갖는다. 예제에서는 scal.. 2022. 4. 24. 이전 1 ··· 7 8 9 10 11 12 13 ··· 34 다음