• Language/Go

    [golang] 1.27에서 추가된 표준 uuid 패키지

    서론UUID는 애플리케이션에서 데이터를 식별하기 위한 용도로 널리 사용되고 있다.하지만 Go 언어에서는 UUID를 처리하기 위한 표준 패키지가 제공되지 않았기 때문에 UUID가 필요한 경우 외부 패키지를 사용하는 경우가 많았다. Go 1.27부터는 RFC 9562를 지원하는 표준 uuid 패키지가 추가되었다. 이제 UUID를 사용하기 위해 별도의 외부 패키지를 추가하지 않아도 된다.특히 UUID를 단순히 식별자 생성 용도로 사용하고 있었다면 별도의 외부 의존성 없이 표준 패키지만으로 처리할 수 있게 되었다.의존성이 필요했던 시절기존 Go 프로젝트에서 UUID를 생성하려면 외부 패키지를 사용하는 것이 일반적이었다.대표적으로 github.com/google/uuid를 사용하면 다음과 같이 UUID를 생성할 ..

  • Language/Go

    [golang] fasthttp! 속도를 뒤집어 놓으셨다

    서론Go 언어는 기본적으로 HTTP 구현이 net/http라는 표준 패키지로 제공된다. 표준 패키지는 언어와 함께 관리되어 보안 측면에서도 안정적이며 HTTP 표준을 잘 준수하고 있어 대부분의 상황에서 문제 없이 사용할 수 있다. 그러나 net/http 패키지를 사용해서 서버나 클라이언트가 많은 요청을 빠른 응답 시간으로 처리해야 할 때와 같이 성능이 중요한 상황에서는 외부 패키지인 fasthttp 사용을 고려할 수 있다. fasthttp는 이름 그대로 빠른 HTTP를 제공하는 패키지로 net/http와 비교했을 때 최대 10배 빠른 성능을 제공한다. 하지만 fasthttp는 net/http와 API가 호환되지 않기 때문에 기존 코드를 다시 작성하거나 사용법을 새로 익혀야 한다. 또한 net/http의 ..

  • Language/Go

    [golang] 타입 스위치(type switch)로 interface{} 값 처리하기

    서론Go 언어에서 interface{} 타입은 모든 타입을 담을 수 있어 매우 유연하게 사용된다. 그러나 interface{}에 담긴 값의 원래 타입을 알아내고 처리할 때는 주의가 필요하다. 잘못된 타입 변환 시 panic이 발생할 수 있기 때문에 안전하게 타입을 다루는 방법이 중요하다. Go 언어에서 interface{} 타입의 값을 다룰 때 타입 스위치(type switch)를 사용하면 다양한 타입을 안전하게 처리할 수 있다. 타입 스위치는 값이 어떤 타입인지를 확인하고 각 타입에 맞는 처리를 할 수 있게 도와준다. 타입 스위치 예제package mainimport "fmt"func do(i interface{}) { switch v := i.(type) { case int: ..

  • Language/Go

    [golang] panic 없이 interface{} 타입 변환하기

    서론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 ..

  • Language/Go

    [golang] Base64 인코딩과 디코딩 처리하기

    서론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)) ..

  • Language/Go

    [golang] 런타임에 콜 스택 출력하기

    서론디버깅은 소프트웨어 개발 과정에서 중요한 부분을 차지한다. 코드가 예상대로 동작하지 않거나 오류가 발생했을 때, 문제의 원인을 추적하고 해결하는 데 많은 시간이 소요된다. 특히 함수 호출 순서나 실행 흐름을 파악하는 것이 어려울 때, 콜 스택을 출력하는 방법은 매우 유용한 도구가 된다. Go 언어는 runtime과 debug 패키지를 제공하여, 런타임 중 함수 호출 정보를 쉽게 출력하고 코드 흐름을 추적할 수 있게 한다. 이러한 콜 스택 출력 기능은 디버깅 과정에서 매우 유용하며, 예기치 않은 오류를 해결하는 데 큰 도움이 된다. STDERR에 콜 스택 출력package mainimport "runtime/debug"func subModule() { debug.PrintStack()}func M..

  • Language/Go

    [golang] panic과 recover로 try-catch 따라 하기

    서론많은 프로그래밍 언어에서 사용되는 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..

  • Language/Go

    [golang] path/filepath 패키지로 멀티 플랫폼에서 파일 경로 처리

    서론현대의 애플리케이션은 다양한 플랫폼에서 동작해야 하는 경우가 많다. 특히 파일 경로를 다루는 작업은 운영 체제마다 파일 경로 구분자가 다르기 때문에 멀티 플랫폼 개발에서 흔히 마주치는 도전 과제 중 하나이다. Go 언어는 이러한 문제를 해결할 수 있는 표준 패키지를 제공한다. path/filepath 패키지는 각 플랫폼에서 사용하는 방식으로 파일 경로를 안전하게 처리할 수 있다. 파일 경로를 다루는 작업에서는 path/filepath 패키지를 사용해 처리하는 것이 플랫폼에 따른 코드 호환성을 보장하는 최선의 방법이다. 이 글에서는 간단한 예제를 통해 path/filepath 패키지의 사용법을 알아본다. path/filepath 패키지 사용하기package mainimport ( "fmt" ..

  • Language/Go

    [golang] flag 패키지로 명령줄 옵션 처리하기

    서론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..