[golang] 메모리 지역성을 고려한 2차원 슬라이스 순회
·
Language/Go
서론2차원 슬라이스를 순회할 때 성능에 큰 영향을 미치는 요소 중 하나는 메모리 지역성이다. 메모리 지역성이란 CPU가 데이터를 빠르게 접근하기 위해 메모리에서 데이터를 어떻게 참조하는지에 대한 패턴을 의미한다. CPU 캐시는 메모리의 연속적인 데이터를 빠르게 읽을 수 있는 공간적 지역성 특성을 갖고 있다. 공간적 지역성은 연속된 메모리 주소의 데이터가 자주 참조되는 특성으로 하나의 데이터가 참조되면 그 인접한 데이터도 순차적으로 참조될 확률이 높다는 것이다. 이러한 특성으로 연속적인 메모리 접근은 성능상 유리하다. 반대로 불연속적인 메모리 접근은 캐시 미스를 유발하고 이로 인해 성능 저하를 초래할 수 있다.이 글에서는 메모리 지역성을 고려하여 2차원 슬라이스를 순회할 때 행 우선 순회와 열 우선 순회의..
[golang] URL 및 쿼리 파라미터 파싱과 수정하기
·
Language/Go
서론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 { ..
[golang] 텍스트 이미지 생성 및 JPEG 인코딩
·
Language/Go
서론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..
[golang] GOMAXPROCS로 최대 CPU 코어 수 제한하기
·
Language/Go
서론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보다 작은 값으..
[golang] 파일 잠금으로 프로그램 중복 실행 방지하기
·
Language/Go
서론무려 Go언어에서 개발할 수 있는 GUI 프로그램에서는 중복 실행을 방지해야 하는 경우가 있다. 서버 프로그램은 특정 포트에 바인딩을 하므로, 이미 해당 포트가 사용 중이라면 두 번째 프로세스는 바인딩에 실패하며 중복 실행이 자연스럽게 방지된다. 하지만 일반 프로그램의 경우에는 포트 바인딩과 같은 방법을 사용할 수 없기 때문에, 별도로 중복 실행을 막기 위한 방법이 필요하다. 이를 해결하기 위해 Go 언어에서 파일 잠금을 이용하여 중복 실행을 방지하는 방법을 활용할 수 있다. 예제package mainimport ( "bufio" "fmt" "os" "syscall")func main() { file, err := os.OpenFile("myapp.lock", os.O_CREATE|os.O_RDWR,..
[golang] 현재 운영 체제 확인하기
·
Language/Go
서론Go 언어에서는 빌드 태그를 사용하여 운영 체제별 동작을 구분할 수 있지만 간단하게 현재 운영 체제를 확인하는 방법도 있다. 이 방법으로 빌드 태그를 사용하기 복잡할 때나, 코드 내에서 운영 체제에 따른 분기를 간단히 처리하고 싶을 때 활용할 수 있다. 예제package mainimport ( "fmt" "runtime")func main() { switch runtime.GOOS { case "linux": fmt.Println("Running is Linux 🐧") case "windows": fmt.Println("Running is Windows ⊞") case "darwin": fmt.Println("Running is macOS 🍎") default: fmt.Println("Un..
[golang] iota 키워드로 열거형 상수 정의
·
Language/Go
서론코드 내에서 열거형 상수를 정의할 때, Go 언어는 이를 간편하게 처리할 수 있는 iota라는 키워드를 제공한다. iota는 상수의 값을 자동으로 증가시키는 특성을 가지며, 값의 증가 범위나 증감 간격을 설정하여 개발자가 반복적인 값을 일일이 지정할 필요 없이 쉽게 상수를 정의할 수 있게 해준다. 이 글에서는 iota 키워드의 기본 사용법과 다양한 활용 방법을 정리해본다. 기본 사용 예제package mainimport "fmt"const ( Low = iota Medium High)func main() { fmt.Println("Low:", Low) // Low: 0 fmt.Println("Medium:", Medium) // Medium: 1 fmt.Println("High:", Hig..
[golang] sync.WaitGroup으로 고루틴 작업 기다리기
·
Language/Go
서론Go 언어에서는 동시성 처리를 간편하게 할 수 있는 고루틴(goroutine)을 제공한다. 여러 고루틴을 동시에 실행하고 이들의 작업이 완료될 때까지 기다리는 문제는 sync.WaitGroup을 사용하여 해결할 수 있다. sync.WaitGroup은 여러 고루틴의 작업을 동기화하고 모든 고루틴이 작업을 완료할 때까지 대기하는 기능을 제공한다. 이를 통해 고루틴들이 완료될 때까지 기다리며 효율적인 병렬 처리를 할 수 있다. 예제package mainimport ( "fmt" "sync")func main() { var wg sync.WaitGroup for i := 0; i  메소드 설명메소드설명sync.WaitGroup.Add(n int)WaitGroup에 대기할 고루틴을 n만큼 추가한다.sync.W..
[golang] html/template 패키지로 동적 페이지 처리하기
·
Language/Go
서론Go 언어에서 html/template 패키지를 사용하면 HTML 문서 내에서 Go 템플릿 문법을 활용하여 Go와 상호작용하며 동적 페이지를 구성할 수 있다. Go 템플릿에는 조건문, 반복문 및 Go 함수 호출을 사용하여 JSP, PHP, ASP와 같은 서버 사이드 스크립트 언어처럼 사용할 수 있다. 이 글에서는 간단한 HTTP 서버에서 html/template 패키지를 활용하여 동적 웹 페이지를 서비스하는 방법을 소개한다. Go 변수를 HTML에 출력하기Go 코드package mainimport ( "html/template" "log" "net/http")var totalCnt intfunc main() { http.HandleFunc("/", handler) log.Fatal(http.Liste..
[golang] json.Marshal에서 HTML 이스케이프 문제
·
Language/Go
서론Go 언어는 encoding/json 패키지로 외부 종속성 없이 JSON 인코딩을 쉽게 처리할 수 있다. 대부분의 경우 Marshal 메소드로 특별한 문제를 느끼지 못하고 사용하지만 JSON 인코딩을 수행할 때 , & 같은 HTML 관련 문자는 기본적으로 각각 \u003c, \u003e, \u0026으로 변환되어 출력된다. 이는 Marshal 메소드 문서를 보면 JSON이 HTML 태그 내부에 안전하게 삽입될 수 있도록 이스케이프하고 Encoder를 사용해서 비활성화할 수 있다고 나와있다. 이 글에서는 json.Marshal에서 HTML 이스케이프를 제어하는 방법에 대해서 정리해본다. JSON 근데 이제 HTML 이스케이프를 곁드린package mainimport ( "encoding/json" "..