Go 57

Go 언어로 문자열 결합 최적화하기: strings.Builder 완벽 가이드 및 벤치마크

Go 언어로 문자열 결합 최적화하기: strings.Builder 완벽 가이드 및 벤치마크strings.Builder 내부 살펴보기용량이 있는 []byte에 append하는 것이 더 빠르다!strings.Builder의 편리한 메서드결론strings.Builder를 사용한 문자열 결합은 단순히 +=를 사용하는 것보다 훨씬 빠르다! 특히, strings.Builder.Grow()를 사용해 미리 용량을 확보해두는 방법이 가장 빠르고 사용하기도 좋다.strings.Builder 내부 살펴보기strings.Builder는 Write 메서드를 사용해 문자열 등을 효율적으로 구축하기 위해 사용된다. strings.Builder 자체는 외부로 공개된 필드가 없는 구조체이다.type Builder struct { ..

Go 2024.05.19

Go 언어 슬라이스 완벽 이해 - 구현과 활용

Go 언어 슬라이스 완벽 이해 - 구현과 활용슬라이스의 실체요소에 접근하기요소 추가하기용량이 충분한 경우용량이 부족한 경우마무리마무리슬라이스의 실체Go의 런타임 코드를 보면, Go의 슬라이스는 다음과 같이 정의되어 있습니다.type slice struct { array unsafe.Pointer len int cap int} reflect 패키지의 SliceHeader를 봐도 다음과 같이 정의되어 있습니다.type SliceHeader struct { Data uintptr Len int Cap int} 즉, Go의 슬라이스는 다음 그림처럼 배열에 대한 포인터와 길이, 그리고 용량을 가진 값으로 표현됩니다.런타임과 reflect 패키지에서 포인터를 unsafe...

Go 2024.05.19

동적인 요소를 가진 JSON을 깔끔하게 Unmarshal하기

동적인 요소를 가진 JSON을 깔끔하게 Unmarshal하기시작하며요점Unmarshal할 때 에일리어스를 정의하고 동적인 요소를 json.RawMessage로 상속정리시작하며JSON API 클라이언트를 만들 때, 특정 요소가 동적인 값을 가지는 JSON을 Unmarshal해야 할 때가 있습니다. 예를 들어, 아래와 같은 JSON입니다. 여기서 shape 요소의 값이 동적으로 변하는 상황을 가정합니다.{ "id": "001", "type": "circle", "shape": { "radius": 5 }}{ "id": "002", "type": "rectangle", "shape": { "height": 5, "width": 2 ..

Go 2024.05.17

Go에서의 소수점 연산과 오차 처리

Go에서의 소수점 연산과 오차 처리Better C - Go와 소수시프트 연산올림, 내림반올림제로 나누기NaN(비수)Inf(무한)제로 나누기에서 panic이 발생하지 않는 경우오차절단 오차유효 숫자 감소 오차정보 감소 오차반올림 오차오차가 발생하지 않는 특수 케이스상수최대값과 최소값캐스트예제위반 코드(C 언어)적합 코드(Go)비교부동 소수점 변수를 루프 카운터로 사용하지 않기위반 코드(C 언어)적합 코드(Go)Better C - Go와 소수시프트 연산소수점(float)에서 시프트 연산을 하면 컴파일 에러가 발생합니다.var a float64 = 100b := a 실행 결과:main.go:9:9: invalid operation: a 올림, 내림math 패키지의 Ceil(), Floor(), Trunc() ..

Go 2024.05.17

json.Unmarshal 사용시 타임(time) 형식을 유연하게 변경하는 방법

Go 언어에서 json.Unmarshal을 사용하여 JSON 데이터를 구조체로 변환할 때, 시간 필드의 형식을 유연하게 지정할 수 있는 방법이 있는데요. 사용자 정의 시간 필드 타입을 만들거나, 라이브러리를 사용하여 기본적인 time.Time 타입 대신 다른 형식의 시간 문자열을 처리할 수 있다는 겁니다. 예를 들어, tson 라이브러리는 사용자가 시간 형식을 설정할 수 있게 해주며, 이 설정을 통해 json.Unmarshal을 사용할 때 해당 형식을 사용할 수 있는겁니다. ** 목차 **json.Unmarshal 사용시 타임(time) 형식을 유연하게 변경하는 방법앞으로 사용할 구조체와 변수tson 라이브러리 사용시좀 더 생각해 보기해결책상세 구현마무리앞으로 사용할 구조체와 변수이 글에서 사용할 구조체..

Go 2024.05.04

Go 언어 인터페이스 구현 패턴

안녕하세요? 오늘은 Go 언어 인터페이스 구현 패턴과 함께 type, 메소드 그리고 인터페이스의 기본적인 설명을 추가하여 아래와 같은 것들을 살펴볼 예정입니다.Go 언어에서의 인터페이스 부분 구현 패턴struct에 interface를 포함시켜 동적으로 교체하는 패턴먼저 type과 메소드, 기본적인 인터페이스 구현 방법에 대해 잠시나마 복습해보겠습니다. ** 목 차 **Go 언어 인터페이스 구현 패턴type으로 타입을 선언하기메소드기본적인 인터페이스의 구현함수에 인터페이스 구현하기구조체에 포함시켜 인터페이스 구현하기인터페이스의 부분 구현을 위한 임베딩 사용인터페이스의 동적 구현을 위한 임베딩 사용마지막으로type으로 타입을 선언하기우선, Go 언어에서의 타입 선언 방법입니다. Go 언어를 처음 시작하는 분..

Go 2024.04.14

Go의 채널 처리 패턴 모음

안녕하세요? 오늘은 Go의 채널 처리 패턴에 대해 알아보겠습니다. ** 목 차 **Go의 채널 처리 패턴 모음Go의 채널 기초정의close송신수신주의해야 할 사항일반적인 안티패턴종료를 수신자에게 알리기 위해 종료 이벤트를 보내기close될 가능성이 있는 채널을 첫 번째 반환값으로만 받기goroutine에서 여러 이벤트가 올 수 있는데 처음 것만 받고 빠져나가기채널이 닫혔는지 확인하고 싶은 경우고속으로 보내기채널로 병렬 수 관리하는 경우의 패턴채널로 처리 종료를 기다리는 패턴채널의 close를 감지하는 패턴채널에서 반복 처리하는 경우의 패턴 모음송신 측 1개, 수신 측 1개송신 측 1개, 수신 측 다수송신 측 다수, 수신 측 1개송신 측 다수, 수신 측 다수select 대기에 대해에러 수집(하나만 잡으면 ..

Go 2024.04.13

Go 언어로 간단한 수식 평가기 만들어보기

안녕하세요! 오늘은 Go 언어의 go 패키지를 활용해 간단한 수식 평가기를 만들어보려고 합니다. 평소에 go 패키지를 제대로 써본 적이 없었는데, 요즘 회사 일을 하면서 추상 구문 트리(AST)를 자주 다뤄야 해서 기회가 생겼네요. 수식 평가기는 들리기에는 좀 어려울 수 있지만, 대부분 go 패키지의 기능을 활용하면 상당히 간단하답니다. 그럼 어떻게 만드는지 하나씩 살펴볼까요?AST(Abstract Syntax Tree)란?AST란 프로그래밍 언어의 소스 코드를 추상적인 구문 트리로 나타낸 것을 말합니다. 코드를 파싱하면 이렇게 트리 형태로 만들어지는데, 각 노드는 코드의 구문 구조(문법적 의미)를 나타냅니다. 예를 들어 "x = 1 + 2" 라는 간단한 코드라면, AST는 대략 이런 식으로 구성될 것입..

Go 2024.03.30

Go언어의 const 식별자 iota 소개

Go언어에서 조금 덜 알려진 언어 명세인 iota에 대해 소개하겠습니다. 입문서에도 나오는 내용이지만, 읽고 지나치기 쉽죠. 특별히 새로운 내용은 아니므로 제목만 보고도 알고 있다 싶으신 분들은 다른 글로 넘어가셔도 됩니다.iota란?iota는 const(상수) 선언 내에서 기본으로 사용되는 식별자입니다. 타입 없는 정수의 연속된 값을 생성합니다. 구체적인 예시를 한번 보겠습니다.package mainimport "fmt"const ( zero = iota one = iota two = iota three = iota)func main() { fmt.Printf("zero:%v\n", zero) fmt.Printf("one:%v\n", one) fmt.Pr..

Go 2024.03.30

Go 언어로 작성된 프로세스를 외부에서 모니터링할 수 있는 'gops'

이번에는 Google에서 만든 gops라는 도구를 소개하고자 합니다. GitHub - google/gops: A tool to list and diagnose Go processes current...https://github.com GitHub: Let’s build from hereGitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and fea...github.com gops는 ps 명령과 유사하게 동작하지만, Go..

Go 2024.03.30