• Language/Go

    [golang] sync.WaitGroup으로 고루틴 작업 기다리기

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

  • Language/Go

    [golang] html/template 패키지로 동적 페이지 처리하기

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

  • Language/Go

    [golang] json.Marshal에서 HTML 이스케이프 문제

    서론Go 언어는 encoding/json 패키지로 외부 종속성 없이 JSON 인코딩을 쉽게 처리할 수 있다. 대부분의 경우 Marshal 메소드로 특별한 문제를 느끼지 못하고 사용하지만 JSON 인코딩을 수행할 때 , & 같은 HTML 관련 문자는 기본적으로 각각 \u003c, \u003e, \u0026으로 변환되어 출력된다. 이는 Marshal 메소드 문서를 보면 JSON이 HTML 태그 내부에 안전하게 삽입될 수 있도록 이스케이프하고 Encoder를 사용해서 비활성화할 수 있다고 나와있다. 이 글에서는 json.Marshal에서 HTML 이스케이프를 제어하는 방법에 대해서 정리해본다. JSON 근데 이제 HTML 이스케이프를 곁드린package mainimport ( "encoding/json" "..

  • Language/Go

    [golang] reflect 패키지를 사용한 외부 패키지의 private 필드 접근하기

    서론Go 언어에서 이 소문자로 시작하는 필드는 private 필드로 외부 패키지에서 접근할 수 없다. 그렇다고 private 필드에 접근이 완전히 불가능한 것은 아니다. 하지만 private 필드는 외부에 공개되지 않기 때문에 패키지가 업데이트될 때 내부 구현이 변경될 수 있으며 이로 인해 해당 필드에 의존하는 코드가 예상치 못한 동작을 하거나 오류가 발생할 위험이 있다. 따라서 테스트 목적으로만 사용하거나 해당 필드가 제거되거나 변경될 경우를 대비해 오류 처리를 할 수 있는 상황에서만 사용해야 한다. 이 글에서는 reflect 패키지를 사용하여 외부 패키지의 private 필드에 접근하는 방법을 간략하게 정리해본다. private 모든 값 가져오기package mainimport ( "fmt" "tim..

  • Language/Go

    [golang] cgo에서 Go와 C 언어 간의 버퍼 전달

    서론Go 언어는 간결하고 효율적인 프로그래밍을 위한 훌륭한 선택이다. 그러나 특정 작업에서는 Pure Go만으로는 한계에 부딪히기도 한다. 특히 미디어 트랜스코딩과 같은 작업에서는 적절한 라이브러리가 없어 C와 같은 저수준 언어의 도움을 받아야 할 때가 있다. 이러한 이유로 나는 Go와 C 간의 상호작용을 구현하기 위해 cgo를 사용하여 버퍼를 전달하는 작업을 했었다. 이 글에서는 cgo를 사용하여 Go와 C 간의 버퍼를 전달하는 방법을 간략하게 정리해본다. Go에서 사용하던 버퍼를 C로 전달package main// #include //// void Go2C(unsigned char* buf, int len) {// for (int i=0; i출력 결과4A 61 65 2D 53 75 6E 67 ..

  • Language/Go

    [golang] 동일한 문자열 메모리 공유

    같은 문자열은 같은 주소Go 언어에서 동일한 값의 문자열을 가진 string 변수가 여러 개 있을 경우 같은 메모리를 공유한다.package mainimport ( "fmt" "unsafe")func main() { owner := "Jae-Sung" author := "Jae-Sung" ownerAddr := (*[2]uintptr)(unsafe.Pointer(&owner))[0] authorAddr := (*[2]uintptr)(unsafe.Pointer(&author))[0] fmt.Printf("owner addr: %x\n", ownerAddr) fmt.Printf("author addr: %x\n", authorAddr)}출력 결과owner addr: 4b0514author addr: 4b05..