Go 57

Go 1.23 iter 패키지 완전 정복

소개 Go 1.23 버전부터 새롭게 등장한 iter 패키지는 개발자들에게 반복 처리(iteration)를 보다 효율적이고 유연하게 관리할 수 있는 방법을 제공합니다. iter 패키지는 추상화된 반복자(iterator) 개념을 도입하여, 기존의 반복 처리 방식을 개선하고 다양한 활용 가능성을 열어줍니다. 이 글에서는 iter 패키지의 기본 개념과 사용법, 그리고 실제 활용 예시를 통해 Go 개발에서의 활용성을 살펴보겠습니다.  iter 패키지의 핵심 개념 iter 패키지는 주로 for-range 문과 함께 사용됩니다. 핵심적인 역할은 컨텍스트(context)를 가진 논리적인 열거 가능 객체를 생성하고, 이를 다른 코드 블록에서 for-range를 통해 순회하는 데 도움을 주는 것입니다. 기존에는 gorou..

Go 2024.08.24

Go 1.23 이터레이터 완벽 정리

안녕하세요? 오늘은 Go 1.23 버전부터 새롭게 추가된 이터레이터에 대해 자세히 알아보려고 합니다. Go 1.23 이터레이터, 넌 누구니?2024년 8月 13일, 드디어 Go 1.23 버전이 세상에 공개되었습니다! 이번 버전의 가장 큰 변화 중 하나는 바로 이터레이터의 등장인데요, 오늘 포스팅에서는 Go의 이터레이터가 무엇인지, 어떻게 사용하는지, 그리고 여러분이 이터레이터에 대해 어디까지 알아야 하는지 자세히 알려드리겠습니다. 자세히 알아보기1. 달라진 for 문 range 루프Go 1.22 버전까지는 for 문의 range 루프를 사용할 때 배열, 슬라이스, 문자열, 맵, 채널, 정수만 사용할 수 있었습니다. 하지만 Go 1.23 버전부터는 특정 형식의 함수도 range 루프에서 사용할 수 있게 되..

Go 2024.08.20

Go 1.22의 새로운 기능: cmp.Or

안녕하세요?Go 1.22가 출시된 지 꽤 많은 시간이 지났는데요. 이제 제가 1.22 버전을 정리하는 시리즈의 마지막을 장식할 때가 왔습니다. 이전에 작성한 reflect.TypeFor와 slices.Concat 함수에 대한 글을 먼저 읽으시는게 좋을 듯 합니다. 오늘 소개할 마지막 함수는 바로 cmp.Or입니다. 실제로 이 함수의 개발자는 Go Time 팟캐스트에서 이 함수를 "1.22의 숨겨진 보석"이라고 소개한 바 있습니다. 간단한 기능이지만 다양한 활용 가능성을 가지고 있으며, 그 탄생 배경에는 놀랍도록 긴 이야기가 숨겨져 있습니다. cmp.Or: 제네릭 기반 조건부 값 선택의 새로운 접근 방식 cmp.Or 함수는 가변 개수의 인자를 받아, 첫 번째 non-zero 값을 반환하는 제네릭 함수입니다..

Go 2024.07.29

Go 1.22의 새로운 기능: slices.Concat

지난 블로그에서는 Go 1.22에 추가된 reflect.TypeFor 함수에 대해 소개해드렸습니다. 이번에는 slices.Concat 함수에 대해 심층적으로 분석해 보겠습니다. slices.Concat: 제네릭 슬라이스 연결의 새로운 패러다임 slices.Concat 함수는 가변 개수의 슬라이스를 입력으로 받아 하나의 새로운 슬라이스로 연결하여 반환하는 제네릭 함수입니다. 이 함수의 시그니처는 다음과 같습니다.// Concat returns a new slice concatenating the passed in slices.func Concat[S ~[]E, E any](slices ...S) S slices.Concat 함수는 제네릭 슬라이스 라이브러리에 필수적인 기능이며, 실제로 저는 2021년 5월..

Go 2024.07.29

Go 1.22의 새로운 기능: reflect.TypeFor

안녕하세요! Go 1.22가 발표되면서, reflect.TypeFor 함수가 드디어 세상에 공개되었습니다. 오늘은 이 함수의 배경과 기능, 그리고 그 의미에 대해 좀 더 깊이 있게 살펴보도록 하겠습니다. reflect.TypeFor: 제네릭 기반 타입 리플렉션의 새로운 지평 Go 1.18 이후 제네릭이 도입되면서 Go 언어는 타입 안전성과 코드 재사용성 측면에서 큰 진전을 이루었습니다. 이러한 발전의 연장선상에서, reflect.TypeFor 함수는 제네릭을 활용하여 런타임에 타입 정보를 획득하는 새로운 패러다임을 제시합니다. 기존의 reflect.TypeOf 함수는 인터페이스를 통해 전달된 값의 concrete 타입을 반환했습니다. 하지만 인터페이스 자체의 타입 정보는 런타임에 유실되는 문제가 있었죠...

Go 2024.07.29

Go 1.23의 숨겨진 보석: reflect.Value.Seq와 reflect.Value.Seq2

Go 프로그래밍 언어는 간결하고 효율적인 코딩을 지향하지만, 이터레이터와 관련된 부분에서는 다소 불편함이 있었습니다. 새로운 Go 1.23 버전에서는 이러한 문제를 해결하기 위해 reflect.Value.Seq와 reflect.Value.Seq2라는 기능이 추가되었습니다. 이 기능들은 다양한 타입을 이터레이터로 변환하여 훨씬 더 쉽게 반복 작업을 수행할 수 있게 해줍니다. 이 글에서는 이 새로운 기능들이 어떤 문제를 해결하고 어떻게 사용되는지에 대해 자세히 살펴보겠습니다. 기존 채널 기반 이터레이터의 문제점Go에서 이터레이터 패턴을 구현할 때 주로 채널을 사용했습니다. 하지만 이 방법에는 몇 가지 문제점이 있었습니다:제네릭이 없어서 타입별로 유틸리티를 작성해야 함: Go 1.18부터 제네릭이 도입되어 이..

Go 2024.07.29

Go에 삼항 연산자가 도입되지 않는 이유

Go에 삼항 연산자가 도입되지 않는 이유FAQGo에 ?: 연산자가 없는 이유는 무엇인가요?중첩을 허용하다Python의 경우코드 커버리지에 대해대체 방법if-else를 그대로 사용하기함수를 선언하기switch 구문룩업 테이블빌드 태그에 의한 전환요약부연Go 언어에 대해 종종 "왜 삼항 연산자가 없나요?"라는 질문을 볼 수 있습니다. 언어 개발 측의 의견과 제 생각을 정리해 보겠습니다.FAQ그 답변은 Go의 FAQ에 명확히 나와 있습니다.Go에 ?: 연산자가 없는 이유는 무엇인가요?Go에는 삼항 테스트 연산자가 없습니다. 같은 결과를 얻기 위해서는 다음을 사용할 수 있습니다.if expr { n = trueVal} else { n = falseVal} Go에 ?: 연산자가 없는 이유는 언어 설계자..

Go 2024.06.02

Go 언어는 매력적이다

Go 언어는 매력적이다익명 필드를 사용한 상속의 문제점해결 방법리시버를 사용할 때 주의할 점배열 길이 생략 표현해결 방법슬라이스에러 핸들링번외: Go 언어에서 try...catch에 가까운 구현for range세미콜론 자동 삽입에 의한 문법 제약이름 공간과 패키지 이름interface{}가 nil이 되지 않는 문제교훈프리미티브 타입(chan)에서 변수 자동 초기화를 기대할 수 없음해결 방법Go Modules 사용 시 고유 URL 필요Go의 툴체인에 --verbose에 해당하는 기능이 없음GoTo가 사용 가능결론익명 필드를 사용한 상속의 문제점Go 언어는 객체 지향 언어는 아니지만, 구조체와 리시버를 사용하여 객체의 멤버를 "호출"할 수 있습니다. 먼저, Animal "클래스"를 만들어보고, 자기소개를 위..

Go 2024.06.01

Golang에서 로그를 출력하는 팁

Golang에서 로그를 출력하는 팁TL;DR라이브러리(패키지)를 작성할 때…애플리케이션을 작성할 때…라이브러리의 로깅라이브러리에서 *log.Logger를 사용하는 경우라이브러리에서 자체 Logger 인터페이스를 정의하는 경우기존의 로깅 라이브러리는 절대 No Good애플리케이션의 로깅글을 마치며 Golang으로 프로그램을 작성할 때 로그는 어떻게 출력하시나요? 이번 글에서는 로그를 출력할 때의 팁과 주의할 점, 그리고 그 이유에 대해 설명해 드리겠습니다. 로그 출력 방법은 라이브러리에서 로그를 출력하는 경우와 애플리케이션에서 로그를 출력하는 경우에 따라 상당히 다릅니다.TL;DR라이브러리(패키지)를 작성할 때…먼저 로그를 출력하지 않는 것을 고려해 보세요. error로 반환하여 라이브러리 사용자가 로그를..

Go 2024.06.01

Go의 문자열 결합 성능 비교

Go의 문자열 결합 성능 비교테스트 케이스구현+= 연산자 루프strings.Join 함수한 번의 대입문으로 + 연산자로 모든 요소를 결합[]byte 사용용량을 지정한 []bytebytes.Buffer 사용용량을 지정한 bytes.Buffer용량을 지정한 bytes.Buffer + WriteString결과 정리결론안녕하세요! 이번 글에서는 Go 언어에서 문자열을 결합하는 여러 가지 방법을 비교해보려고 합니다. 다양한 방법을 벤치마크 테스트를 통해 성능을 비교하고, 가장 효율적인 방법을 찾아봅시다.테스트 케이스아래와 같은 9글자 * 10개의 요소로 이루어진 문자열 배열을 ","로 결합하고, 마지막에 ","를 추가하는 코드를 구현했습니다. 원하는 출력은 string이기 때문에, []byte나 bytes.Buf..

Go 2024.05.19