프로그래밍 일반/Go 프로그래밍 11

[go] golang의 %w

%w%w는 주로 fmt.Errorf 함수에서 오류(wrapping errors)를 감쌀 때 사용됩니다.Go 1.13에서 도입된 기능으로, 새로운 오류를 생성하면서 기존 오류를 감싸기(wrap) 위해 사용합니다. %w는 fmt.Printf와 같은 함수에서 직접적으로 사용되지 않으며, 주로 fmt.Errorf와 함께 사용됩니다. package mainimport ( "errors" "fmt")func main() { originalErr := errors.New("original error") wrappedErr := fmt.Errorf("new context: %w", originalErr) fmt.Println(wrappedErr) // new context: original..

[go] golang의 가비지 콜렉터

Go 언어(Golang)에서 가비지 컬렉터(Garbage Collector, GC)는 자동으로 메모리를 관리하여 개발자가 직접 메모리 해제를 처리하지 않도록 도와주는 중요한 기능입니다. Go의 가비지 컬렉터는 다중 스레드, 스톱-더-월드(stop-the-world), 분할 수집 방식을 채택하여 동작합니다.Go의 가비지 컬렉션 특징Go의 가비지 컬렉션은 Mark-and-Sweep 알고리즘을 기본으로 사용하여 동작합니다. 이 알고리즘은 크게 두 단계로 나눠집니다:Mark 단계: GC는 루트(root)에서부터 시작해 참조가 되는 객체들을 추적하고, 사용 중인 객체에 표시를 합니다.Sweep 단계: 사용되지 않는 메모리를 해제합니다. Mark되지 않은 객체들은 더 이상 사용되지 않는 것으로 판단하여 메모리에서 ..

[go] go-redis와 Redigo 비교

Go 언어에서 Redis 사용을 위한 두 주요 패키지, go-redis와 Redigo,를 비교해 보면 각각의 장단점이 다르며 개발자의 필요에 따라 선택이 달라질 수 있습니다.1. go-redis (https://github.com/go-redis/redis)장점문서화가 잘되어 있음: Go 언어 커뮤니티에서 널리 사용되는 패키지로, 튜토리얼과 예제들이 풍부하여 학습이 용이합니다. 공식 문서 외에도 커뮤니티에서 제공하는 자료들이 많아 빠르게 익힐 수 있습니다.사용하기 쉬움: 일반적인 Redis 명령어를 함수로 간편하게 사용할 수 있어 코드 작성이 간결합니다. Redis 클라이언트 설정, 커넥션 관리, 트랜잭션, 파이프라이닝 등 기본적인 기능이 패키지에 포함되어 있어 바로 사용할 수 있습니다.단점확장성의 한계..

[go] %v와 %+v의 차이

%v와 %+v는 Go의 fmt 패키지에서 포맷팅 지시자로 사용되며, 주로 fmt.Printf 등의 함수와 함께 사용됩니다. 이 두 지시자는 데이터를 문자열로 변환할 때 어떻게 표현할지를 결정합니다.  %v (Verb): 기본 포맷 : 값을 기본 포맷으로 출력합니다. 사용하는 예: fmt.Printf("%v", someValue) 구조체를 출력할 경우 필드 이름 없이 값만 출력합니다.  %+v (Detailed Verb): 상세 포맷 : 값을 포함하여 추가 정보를 출력합니다. 사용하는 예: fmt.Printf("%+v", someValue) 특히 구조체를 출력할 때 유용하며, 필드 이름과 값을 모두 출력합니다.  다음은 구조체를 예로 들었을 때의 차이점을 보여주는 예시입니다:package mainimpor..

[go] Context 활용하기

Go 언어로 개발할 때, 단순히 고루틴을 활용하여 동시성 작업을 수행할 수 있지만, 여러 패키지들을 보면 context를 선언하고 고루틴을 관리하는 코드가 빈번히 등장하는 것을 알 수 있습니다. 이 글에서는 context 패키지가 왜 쓰이는지, 그리고 실제 코드를 통해 어떻게 활용하는지 살펴보겠습니다.왜 context를 사용하는가?Go 언어는 고루틴을 통해 동시성 작업을 수행합니다. 동시성 프로그램에서는 특정 작업이 시간 초과되거나 취소되어야 하는 경우가 있으며, 시스템 오류로 인해 작업을 선점해야 하는 상황도 발생할 수 있습니다. 이러한 상황을 대비해 고루틴 간에 작업의 상태를 공유하고 관리하기 위해, context 패키지가 Go 1.7 버전부터 표준 라이브러리로 제공되고 있습니다.기존에는 완료 여부를..

[Go] Slice 기능 요약

슬라이스 배열은 정한 길이에서 더이상 크기가 늘어나지 않습니다. 슬라이스를 사용하면 이러한 불편을 해소 할 수 있습니다. 다음 과 같이 선언하면 크기가 0인 슬라이스가 만들어 집니다. 크기를 초과한 접근을 하면 런타임에 패닉이 발생합니다. var slice []int // 패닉 발생 slice[1] = 10 사용 방법 // {}로 초기화 var slice = []int{1, 2, 3} // 다음은 크기가 3인 배열 선언, 구분합시다! var array = [...]int{1, 2, 3} // make로 초기화 var slice = make([]int, 3) // append로 요소 추가 slice = append(slice, 4) // append로 여러 값 추가 slice = append(slice, ..

Go 언어의 Json Tag

Go 언어의 Json 참고: https://www.joinc.co.kr/w/man/12/golang/json JSON Tag encoding/json 패키지의 경우 아래와 같이 Tag를 이용해서 마샬/언마샬 방식을 설정 할 수 있습니다. type RequestCreateOpenChannel struct { Name string `json:"name"` ChannelUrl string `json:"channel_url"` CustomType string `json:"custom_type"` Data string `json:"data"` IsDynamicPartitioned bool `json:"is_dynamic_partitioned"` } omitempty omit empty : 비어 있으면 생략한다. ..