Backend with Golang 28

Effective Go - Part 4: Embedding & Concurrency

Embedding Go does not provide the typical, type-driven notion of subclassing, but it does have the ability to “borrow” pieces of an implementation by embedding types within a struct or interface. subclassing이란 ? 오직 인터페이스 만이 interface안에 embedded될 수 있다. struct에서도 비슷한데, interface 보다는 광범위한 영향(implication)을 끼친다. field 이름 없이 type을 listing 할 수 있고, field이름과 함께 쓰여질 수 도 있다. 하지만 이름이 있을 경우 method를 전달해주기 위해서..

Backend with Golang 2023.08.16

Effective Go - Part 3

Interface 인터페이스는 어떤 객체가 정해진 행동을 할 수 있다면, 어떤 곳에서 쓰일 수 있다는 object의 행동을 명시한다. 인터페이스의 이름은 보통 method의 이름에서 파생된다. Conversion type Sequence []int일때 프린팅에 필요한 메서드인 String 함수를 만든다면 사실 Sprint 함수가 slice를 가지고 하는 일을 반복하는 꼴이 된다. 이때 Sprint 를 실행하기 전에 Sequence 타입을 []int로 변환할 수 있다. 이름만 무시하면 동일하기 때문에 conversion이 가능한 것이고, 새로운 값을 만들어 내지 않고 현재 값에 새로운 타입이 있는 것처럼 일시적으로 행동하게 된다. (int -> floating point로 변환할 때는 새로운 값을 만드는 ..

Backend with Golang 2023.08.13

Effective Go - Part 2

Initialization Init function : 각각의 source file에서 its own init function을 정의할 수 있다. 여러개 정의할 수도 있다. init 초기화 단계에서 마지막에 되는 단계라고 할 수 있다. init 함수는 모든 variable declaration이 끝난 뒤에 불리게 되며, imported packages가 모두 initialized되었을 때만 불린다. 선언의 형태로 표현할 수 없는 것들을 초기화 하는 것 이외에도, 실제 프로그램의 실행전에 상태를 검증하고 올바르게 복구하는데 자주 사용된다. Go 프로그램은 항상 main 함수로 시작된다. main package가 다른 패키지를 import 하고 있으면 import된 각각의 packages를 먼저 불러온다. ..

Backend with Golang 2023.08.10

Effective Go - Part 1

Switch switch문 밖에 있는 loop을 break하고 싶을때는 label을 사용해서 해당 라벨을 break하면 된다. continue statement 도 마찬가지로 label을 사용할 수 있다. Type switch : switch 는 interface variable의 dynamic type을 밝혀내는 것에 쓰이기도 한다. 아래의 예시처럼 되는데, 이때 t:=t.(type)으로 변수 재사용하는 것은 idiomatic하다. var t interface{} t = functionOfSomeType() switch t:=t.(type) { } defer defer statement는 function call을 function이 return하기 바로 직전에 실행되도록 scheduling한다. def..

Backend with Golang 2023.08.09

[Network] IP Class, Subnet Mask, CIDR

1. IP Class A,B,C 등등 클래스로 나누게 되는데, A클래스: 00000000.00000000.00000000.00000000 (Network Address: 0 - 127) A class network → 128개 → 하나 당 사용할 수 있는 ip 개수 16,777,216 가 된다. B클래스: 10000000.00000000.00000000.00000000 (Network Address: 128.0 ~ 191.255) C클래스: 11000000.00000000.00000000.00000000 (Network Address: 192.0.0 ~ 223.255.255) highlight : network number, other numbers for local address inflexible 하..

Backend with Golang 2023.08.03

Building HTTP Services - Middleware(Network programming with Go)

Middleware는 http.Handler를 인풋으로 받아서 http.Handler를 return 하는 reusable function들이다. 다음 handler에게 passing하기 전에 content에 기반하여 몇가지를 결정하는데 쓰이곤 한다. 아니면 request content에 따라서 response의 header를 작성하기도 한다. 그리고 아래 리스트와 같은 일들을 처리하기도 한다. 하나의 middleware에서 여러개의 테스크를 담당하지 않도록 하는 게 좋다. 대신에 minimalist middleware 를 작성하는 것이 중요하다. authentication collect metrics log requests control access to resources middleware에서는 par..

Backend with Golang 2023.07.30

Building HTTP Services - Handler (Network programming with Go)

Go HTTP Server는 먼저 Server의 multiplexer가 있고, 이 client request 를 받는 것이다. Multiplexer 는 request 의 목적지를 결정한다. 그리고 처리할 수 있는 것으로 전달한다. 처리하는 곳이 Handler이다. Multiplexer 자체도 handler 인데, request를 가장 적절한 handler로 라우팅하는 역할을 한다. Handler가 요청을 전달받기 전에 middleware를 거치게 된다. Middleware는 handler의 behavior를 변경하거나 auxiliary task들을 수행한다. 예를 들면 logging, authentication, access control 등이 있다. srv := &http.Server { Addr: H..

Backend with Golang 2023.07.30

[Concurrency-4] Concurrency Patterns in Go

Synchronization 이 가능한데 confinement 를 추구하는 이유가 뭘까? improved performance와 reduced cognitive load on developers를 이유로 들고 있다. Synchronization 이란 여기서 수행되는 시간들을 조정해서 multiple thread나 process 에서 하나의 데이터가 일치되는 것을 의미할 텐데, 이것은 비용이 들고, 이것을 쓰지 않고 피할 수 있다면 critical section 이 없어지고, synchronizing 하는데에 드는 비용을 쓰지 않아도 될 것이다. 그리고 synchronization을 적용해서 얻을 수 있는 여러 문제점들을 피할 수 있게 된다. 결과적으로 lexical scope 안에서 synchronous..

Backend with Golang 2023.06.17

[Concurrency-3] Go Channel의 사용

unidirectional channel의 경우 function parameter로 사용되는 경우가 많다. goroutine이 scheduled 되면, exit하는 것에 대한 보장이 되지 않는다. channel을 사용하면, code가 omitted되지 않고 잘 끝날 수 있는데, 이를 통해서 channel이 하는 게 blocking이라고 볼 수 있다. write가 된다면 그것이 빌때까지 기다린다는 것을 의미한다. 이때 Deadlock 이 잘 일어날 수 있는데, main goroutine에서 value가 placed되길 기다리고 있는데, 이게 일어나지 않으면 모든 goroutine 이 asleep되어 deadlock 이 일어나는 것이다. value, ok :=

Backend with Golang 2023.06.13