[golang] fasthttp! 속도를 뒤집어 놓으셨다
·
Language/Go
서론Go 언어는 기본적으로 HTTP 구현이 net/http라는 표준 패키지로 제공된다. 표준 패키지는 언어와 함께 관리되어 보안 측면에서도 안정적이며 HTTP 표준을 잘 준수하고 있어 대부분의 상황에서 문제 없이 사용할 수 있다. 그러나 net/http 패키지를 사용해서 서버나 클라이언트가 많은 요청을 빠른 응답 시간으로 처리해야 할 때와 같이 성능이 중요한 상황에서는 외부 패키지인 fasthttp 사용을 고려할 수 있다. fasthttp는 이름 그대로 빠른 HTTP를 제공하는 패키지로 net/http와 비교했을 때 최대 10배 빠른 성능을 제공한다. 하지만 fasthttp는 net/http와 API가 호환되지 않기 때문에 기존 코드를 다시 작성하거나 사용법을 새로 익혀야 한다. 또한 net/http의 ..
[golang] 타입 스위치(type switch)로 interface{} 값 처리하기
·
Language/Go
서론Go 언어에서 interface{} 타입은 모든 타입을 담을 수 있어 매우 유연하게 사용된다. 그러나 interface{}에 담긴 값의 원래 타입을 알아내고 처리할 때는 주의가 필요하다. 잘못된 타입 변환 시 panic이 발생할 수 있기 때문에 안전하게 타입을 다루는 방법이 중요하다. Go 언어에서 interface{} 타입의 값을 다룰 때 타입 스위치(type switch)를 사용하면 다양한 타입을 안전하게 처리할 수 있다. 타입 스위치는 값이 어떤 타입인지를 확인하고 각 타입에 맞는 처리를 할 수 있게 도와준다. 타입 스위치 예제package mainimport "fmt"func do(i interface{}) { switch v := i.(type) { case int: ..
[golang] panic 없이 interface{} 타입 변환하기
·
Language/Go
서론Go 언어에서 interface{} 타입은 모든 타입을 담을 수 있어 매우 유연하게 사용 되는 타입이다. 주로 다양한 데이터 타입을 처리하거나 동적 데이터를 다룰 때 사용된다. 그러나 interface{} 타입으로 처리하다가 원래의 타입으로 변환할 때 잘못된 타입으로 변환을 시도하면 panic이 발생할 수 있다. 이 글에서는 interface{} 타입을 사용할 때 panic을 방지하고 안전하게 타입을 변환하는 방법을 다룬다. 잘못된 단언var gpa interface{} = 4.5// panic: interface conversion: interface {} is float64, not stringmsg := "GPA: " + gpa.(string)fmt.Println(msg)GPA는 float64 ..
[golang] Base64 인코딩과 디코딩 처리하기
·
Language/Go
서론Base64는 데이터를 바이너리에서 텍스트로 변환하는 데 널리 사용되는 방식이다. 주로 바이너리 데이터를 JSON과 XML과 같은 텍스트 기반 프로토콜로 전송할 때나 로그 파일에 기록할 때 사용된다. Go 언어는 Base64 인코딩과 디코딩 작업을 쉽게 처리할 수 있는 표준 패키지를 제공한다. 이 글에서는 encoding/base64 패키지를 사용하여 Base64 인코딩과 디코딩을 하는 방법을 다룬다. Base64 인코딩 / 디코딩 예제package mainimport ( "encoding/base64" "fmt")func main() { data := "Jae-Sung~" encoded := base64.StdEncoding.EncodeToString([]byte(data)) ..
[golang] 런타임에 콜 스택 출력하기
·
Language/Go
서론디버깅은 소프트웨어 개발 과정에서 중요한 부분을 차지한다. 코드가 예상대로 동작하지 않거나 오류가 발생했을 때, 문제의 원인을 추적하고 해결하는 데 많은 시간이 소요된다. 특히 함수 호출 순서나 실행 흐름을 파악하는 것이 어려울 때, 콜 스택을 출력하는 방법은 매우 유용한 도구가 된다. Go 언어는 runtime과 debug 패키지를 제공하여, 런타임 중 함수 호출 정보를 쉽게 출력하고 코드 흐름을 추적할 수 있게 한다. 이러한 콜 스택 출력 기능은 디버깅 과정에서 매우 유용하며, 예기치 않은 오류를 해결하는 데 큰 도움이 된다. STDERR에 콜 스택 출력package mainimport "runtime/debug"func subModule() { debug.PrintStack()}func M..
[golang] panic과 recover로 try-catch 따라 하기
·
Language/Go
서론많은 프로그래밍 언어에서 사용되는 try-catch는 개발자들에게 친숙한 예외 처리 방법이다. 하지만 Go 언어는 try-catch 구문을 제공하지 않고 error 타입을 반환하여 오류를 처리하도록 유도한다. Go는 panic과 recover를 제공하지만 공식 문서에서는 panic은 복구 불가능한 오류에서만 사용해야 하며 일반적인 오류 처리에는 사용하지 말라고 권장하고 있다. 이 글에서는 panic과 recover를 활용해 try-catch 스타일의 예외 처리 방식을 따라 해본다. 다만 이 방법은 권장되지 않으며 실제 개발에서는 사용을 피하고 재미로만 보는 것이 좋다. Don’t PanicDon’t use panic for normal error handling. Use error and multip..
[golang] path/filepath 패키지로 멀티 플랫폼에서 파일 경로 처리
·
Language/Go
서론현대의 애플리케이션은 다양한 플랫폼에서 동작해야 하는 경우가 많다. 특히 파일 경로를 다루는 작업은 운영 체제마다 파일 경로 구분자가 다르기 때문에 멀티 플랫폼 개발에서 흔히 마주치는 도전 과제 중 하나이다. Go 언어는 이러한 문제를 해결할 수 있는 표준 패키지를 제공한다. path/filepath 패키지는 각 플랫폼에서 사용하는 방식으로 파일 경로를 안전하게 처리할 수 있다. 파일 경로를 다루는 작업에서는 path/filepath 패키지를 사용해 처리하는 것이 플랫폼에 따른 코드 호환성을 보장하는 최선의 방법이다. 이 글에서는 간단한 예제를 통해 path/filepath 패키지의 사용법을 알아본다. path/filepath 패키지 사용하기package mainimport ( "fmt" ..
[golang] flag 패키지로 명령줄 옵션 처리하기
·
Language/Go
서론Go 언어는 간단하게 CLI(Command-Line Interface) 프로그램을 작성할 수 있는 표준 패키지를 제공한다. 명령줄에서 데이터를 입력받아 처리하거나 옵션을 지정하는 방식은 많은 개발자들에게 익숙한 방법이다. flag 패키지를 사용하면 명령줄 옵션을 간단하게 정의하고 파싱할 수 있으며, 기본값 설정과 도움말 출력 같은 기능까지 손쉽게 구현할 수 있다. 이번 글에서는 flag 패키지의 간단한 사용법을 CLI 프로그램 예제를 통해 소개한다. 명령줄 옵션 정의v := flag.Bool("v", false, "show version info")name := flag.String("name", "", "Your name")sleep := flag.Int("sleep", 1, "Sleep secon..
[golang] Go 언어 철학에서 switch문이 살아 남은 이유
·
Language/Go
서론Go 언어는 간결성, 명확성, 일관성을 중요시하는 철학을 바탕으로 설계되었다. 이러한 철학은 Go의 문법과 기능 설계에서 뚜렷하게 나타나며, 코드가 복잡해지지 않도록 돕고 간결하고 읽기 쉬운 코드를 작성할 수 있게 한다.Go에서 반복문이 while문이나 do-while문과 같은 반복문은 제공하지 않고 for문만을 제공하는 것을 보면 이러한 철학을 느낄 수 있다. 이는 Go 언어가 코드의 복잡성을 줄이고 개발자가 한 가지 방법으로 문제를 해결하도록 유도하는 설계 방식이라고 생각한다.반복문과 다르게 조건문에서는 if문과 switch문이 공존한다. switch문은 여러 조건을 한 번에 처리할 수 있는 강력한 도구이지만 대부분의 경우 if문으로도 대체할 수 있다. 하지만 switch문에서 fallthroug..
[golang] runtime 패키지로 메모리 사용 추적
·
Language/Go
서론Go 언어는 가비지 컬렉션(GC)을 통해 메모리를 자동으로 관리하지만 실제로 얼마나 많은 메모리를 사용하고 있는지 확인하는 것은 여전히 중요하다. runtime 패키지에는 메모리 사용 상태를 실시간으로 확인할 수 있는 간단한 방법을 제공한다. 이를 통해 메모리 소비량을 모니터링하거나 메모리 사용의 변화를 추적하는 데 유용하다. 이번 글에서는 runtime 패키지를 사용하여 메모리 사용량을 확인하는 방법을 다룬다. 1분 간격으로 메모리 모니터링package mainimport ( "fmt" "runtime" "time")func main() { var memStats runtime.MemStats ticker := time.NewTicker(1 * time.Minute) defer ticker.Stop..