목록[Golang] (19)
쿼카러버의 기술 블로그
Go언어는 byte stream 을 다루는 프로그래밍 언어다. 다시 말해서 바이너리 데이터를 읽거나 쓸 때 byte형식을 주로 사용한다. network connection으로 부터 넘어오는 데이터를 파일로 저장하거나 처리해야 하는 경우 등의 경우에 모두 byte stream을 다룰 수 있어야 한다. 많은 라이브러리에서 io package를 활용하기 때문에 본 글에서는 golang에서 I/O를 처리할 때 byte stream을 다루는 기본적인 방법에 대해 알아보는 시간을 갖도록 해보자. 매우 간단한 기능이지만 정말 많은데 활용될 수 있다는 점에서 매우 흥미롭고 멋있다. 본 글의 기본적인 골자는 Go의 Walkthrough시리즈를 읽으면서 정리하는 거지만, 그 외에도 내가 몰랐었던 디테일들을 채워 나중에 참..
Go는 바이트(bytes)를 사용하여 작업하기 위해 만들어진 프로그래밍 언어다. 근데, gin 프레임워크나 HTTP request 처리하다보면 바이트를 다루기 위한 io 패키지를 사용하다가 아찔한 함정에 빠질 수 있다. 그 함정은 ioutil.ReadAll()이나 이를 활용하는 ctx.GetRawBody()와 같은 메서드 등을 통해 request의 Body를 한 번 읽고나면 다시 읽을 수 없다는 점이다. 이는 컨텐츠를 모두 읽어냈기 때문인데, gin뿐 아니라 http패키지의 Request의 Body를 읽을 때도 마찬가지다. (당연한 소리) (io.Reader를 통해 stream을 한번 읽고나면 idx가 뒤로 가기 때문에 다시 읽을 수 없음) 하지만 API를 개발하다보면, Request Body의 내용을 ..
요약 golang으로 단위 테스트(unit test)를 작성할 때, 테스트에 미리 설정이 필요할 때 (예: DB연결 등)사용하는 패키지 1) testify 패키지 간략한 소개 2) Suite 패키지 기본 사용 메서드 정의(테스트 케이스 정의) Lifecycle정의 (테스트 전후 세팅) Suite Package testify 패키지 Golang에는 testify라는 패키지가 있다. Go code (golang) set of packages that provide many tools for testifying that your code will behave as you intend. testify는 크게 3가지 기능을 제공한다. Easy assertion Mock Test suite interface and..
Type assertion과 Type conversion이 처음에 golang을 공부할때 많이 헷갈리는 개념 중 하나였다. 먼저 assert라는 단어의 사전적 정의를 보면, "사실임을 주장한다"이다. conversion이 의미하는 "전환, 변환"이기 때문에 둘의 사전적 의미에도 많은 차이가 있다. 따라서 이 둘은 분명히 차이가 있는 개념이고, 이 둘에 대해 설명해보겠다. type conversion 형 변환(type casting)이다. golang에서는 형변환을 하기 위해서는 아래와 같이 명시적으로 해주어야 한다. var i int = 42 var f float64 = float64(i) var u uint = uint(f) C와는 다르게, 다른 타입의 변수에 값을 assign하기 위해서는 위처럼 명시..
context를 사용해서 웹서버가 2초 안에 꺼지게 되면 request가 cancel되는 코드를 짜는 예제를 보면 time.After가 많이 쓰인다. 다른 branch가 더 빨리 run하게 되면, timer는 release되지 않는 식으로 select 문에 많이 쓰인다. 그리고 어떻게 작동하는지 확인 하기 위해 아래 예제를 보면, time.After(2*time.Second)는 select문이 도달한 이후 시점 부터 계산되고, function이 끝나는 것을 확인할 수 있다. Memory Leak이 발생하지 않는 케이스 select { case
한줄 요약 1. Marshal : golang object (e.g. string, struct) -> []byte, string 로 변환 2. Unmarshal : []byte, string -> golang object(e.g. struct) 코드 예시 Marshal 1) []string -> string func main() { slcD := []string{"apple", "peach", "pear"} slcB, _ := json.Marshal(slcD) fmt.Println(string(slcB)) } 2) map -> string data := make(map[string]interfcae{}) data["name"] = "richet" data["sex"] = "male" jsonDoc, _..
Go에서 string은 value다. 따라서, nil이 될 수 없다. Go has various value types including strings, integers, floats, booleans, etc. 따라서 아래 코드는 컴파일이 될 수 없다. x := "I am a string!" x = nil // Won't compile, strings can't be nil in Go 하지만 string을 가리키는 pointer(*string)는 nil이 될 수 있다. 따라서 아래 코드는 컴파일이 가능하다. var x *string x = nil 그럼 string pointer는 언제쓸까? 일반적으로 golang에서는 nil이 필요하지 않은 상황이면 string pointer는 사용하는 것을 권장하지 않..
함수 리터럴 외부 변수를 내부 상태로 가져오는 것을 클로저라고 한다. 값 복사가 아닌 참조 형태로 가져오기 때문에, 값 변경에 주의해야 한다. 참조형태로 가져온다는 것은 외부 변수 a를 캡쳐할 때 a의 주솟값을 포인터 형태로 가져와 나중에 메모리 주솟값을 통해 a에 접근한다는 것을 의미한다. 따라서 함수 리터럴이 여러 고루틴에서 실행될 때 이 특성을 꼭 주의해서 사용해야 한다. 아래 예시를 통해서 v값을 사용하는 내부 함수 리터럴들의 출력 결과를 보면 이해에 도움이 될 것이다. package main import ( "fmt" ) func main() { funcList := make([]func(),3) v := 1 for i := 0; i < 3; i++ { fmt.Printf("Inserting %..