• 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..

  • Language/Go

    [golang] Go 언어 철학에서 switch문이 살아 남은 이유

    서론Go 언어는 간결성, 명확성, 일관성을 중요시하는 철학을 바탕으로 설계되었다. 이러한 철학은 Go의 문법과 기능 설계에서 뚜렷하게 나타나며, 코드가 복잡해지지 않도록 돕고 간결하고 읽기 쉬운 코드를 작성할 수 있게 한다.Go에서 반복문이 while문이나 do-while문과 같은 반복문은 제공하지 않고 for문만을 제공하는 것을 보면 이러한 철학을 느낄 수 있다. 이는 Go 언어가 코드의 복잡성을 줄이고 개발자가 한 가지 방법으로 문제를 해결하도록 유도하는 설계 방식이라고 생각한다.반복문과 다르게 조건문에서는 if문과 switch문이 공존한다. switch문은 여러 조건을 한 번에 처리할 수 있는 강력한 도구이지만 대부분의 경우 if문으로도 대체할 수 있다. 하지만 switch문에서 fallthroug..

  • Language/Go

    [golang] runtime 패키지로 메모리 사용 추적

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

  • Language/Go

    [golang] 메모리 지역성을 고려한 2차원 슬라이스 순회

    서론2차원 슬라이스를 순회할 때 성능에 큰 영향을 미치는 요소 중 하나는 메모리 지역성이다. 메모리 지역성이란 CPU가 데이터를 빠르게 접근하기 위해 메모리에서 데이터를 어떻게 참조하는지에 대한 패턴을 의미한다. CPU 캐시는 메모리의 연속적인 데이터를 빠르게 읽을 수 있는 공간적 지역성 특성을 갖고 있다. 공간적 지역성은 연속된 메모리 주소의 데이터가 자주 참조되는 특성으로 하나의 데이터가 참조되면 그 인접한 데이터도 순차적으로 참조될 확률이 높다는 것이다. 이러한 특성으로 연속적인 메모리 접근은 성능상 유리하다. 반대로 불연속적인 메모리 접근은 캐시 미스를 유발하고 이로 인해 성능 저하를 초래할 수 있다.이 글에서는 메모리 지역성을 고려하여 2차원 슬라이스를 순회할 때 행 우선 순회와 열 우선 순회의..

  • Language/Go

    [golang] URL 및 쿼리 파라미터 파싱과 수정하기

    서론Go 언어에서는 net/url 패키지를 사용하여 URL을 간단하게 파싱하고 필요에 따라 URL을 수정할 수 있다. 이 패키지는 URL의 각 구성 요소를 쉽게 추출할 수 있게 해주며 URL을 생성하거나 수정할 때도 사용할 수 있다. URL을 파싱한 후에는 쿼리 파라미터를 동적으로 추가하거나 수정할 수 있으며, URL을 새롭게 생성하는 것도 가능하다. URL 파싱하기package mainimport ( "fmt" "net/url")func main() { rawURL := "https://blog.jae-sung.com/archive/20241115?name=jaeusng&status=sleeply#home" parsedURL, err := url.Parse(rawURL) if err == nil { ..

  • Language/Go

    [golang] 텍스트 이미지 생성 및 JPEG 인코딩

    서론Go 언어에서는 이미지 그리기와 JPEG 인코딩 및 디코딩을 표준 패키지에 제공하고 있어서 복잡한 외부 라이브러리 없이도 간단하게 이미지 파일을 생성하고 처리할 수 있다. image, image/color, image/draw와 같은 기본 패키지들을 활용하면 다양한 형태의 이미지를 생성하고 조작할 수 있으며, image/jpeg 패키지를 사용하면 JPEG 인코딩과 디코딩을 할 수 있다. 이 패키지들을 활용해서 이미지에 텍스트를 그린 후 JPEG으로 인코딩하여 저장해보자. 예제package mainimport ( "image" "image/color" "image/draw" "image/jpeg" "log" "os" "golang.org/x/image/font" "golang.org/x/image/fo..

  • Language/Go

    [golang] GOMAXPROCS로 최대 CPU 코어 수 제한하기

    서론Go 언어에서는 GOMAXPROCS를 사용하여 프로세스가 사용할 수 있는 최대 CPU 코어 수를 제한할 수 있다. 기본적으로 Go는 가능한 모든 CPU 코어를 활용하지만 멀티코어 시스템에서 특정한 상황에 맞게 CPU 리소스를 조절할 필요가 있을 때 GOMAXPROCS를 사용하여 CPU 코어 수를 설정할 수 있다. GOMAXPROCS로 CPU 코어 수 제한package mainimport ( "fmt" "runtime")func main() { cpuNum := runtime.GOMAXPROCS(1) fmt.Printf("CPU: %d -> 1\n", cpuNum)}사용법은 간단하게 GOMAXPROCS에 원하는 CPU 코어 수를 인수로 전달하면 된다. 이때 이전에 설정된 값이 반환되며 1보다 작은 값으..

  • Language/Go

    [golang] 파일 잠금으로 프로그램 중복 실행 방지하기

    서론무려 Go언어에서 개발할 수 있는 GUI 프로그램에서는 중복 실행을 방지해야 하는 경우가 있다. 서버 프로그램은 특정 포트에 바인딩을 하므로, 이미 해당 포트가 사용 중이라면 두 번째 프로세스는 바인딩에 실패하며 중복 실행이 자연스럽게 방지된다. 하지만 일반 프로그램의 경우에는 포트 바인딩과 같은 방법을 사용할 수 없기 때문에, 별도로 중복 실행을 막기 위한 방법이 필요하다. 이를 해결하기 위해 Go 언어에서 파일 잠금을 이용하여 중복 실행을 방지하는 방법을 활용할 수 있다. 예제package mainimport ( "bufio" "fmt" "os" "syscall")func main() { file, err := os.OpenFile("myapp.lock", os.O_CREATE|os.O_RDWR,..