- Go 새소식
- Go 릴리스 관련
- 새로운 프로젝트 & 릴리스
- 튜토리얼 & 가이드
- 기술글 & 경험담 & 개선기
- Go Draft Design
- 이번달에 Accepted된 Proposals
- 읽을거리
이번에 Go 2의 실험 기능으로 들어간 제네릭의 표현법에 관한 논의입니다. 제네릭 타입을 명시할 때 사용할 괄호의 종류로는 []와 <>를 고려중이며, 파싱 이슈 및 모호한 표현등을 해결할 다양한 syntax들이 제안되면서 계속해서 논의중입니다.
GopherCon 2020 발표 자료 영상 목록이 공개되었습니다.
Go 1.15의 rc1 버전이 릴리스 되었습니다. go vet 명령어에 string(x) 변환에 대한 워닝과 불가능한 inteface assertion에 대한 검사가 추가되었고, tzdata가 표준 라이브러리로 내장되는등의 업데이트가 있습니다. 자세한건 ChangeLog를 확인해보세요.
Go 랭귀지 서버인 golpls의 0.4.2 버전이 릴리스 되었습니다. 메모리 관련 이슈가 상당히 개선되었다고 합니다.
Copyist 패키지는 테스트 중에 작성된 sql 호출을 자동으로 기록하여, 다음에는 실제 sql 데이터베이스에 연결하지않고 해당 호출을 재생할 수 있습니다.
이 릴리스에는 기본 JavaScript 번들링, ES6 모듈을 위한 스코프 호이스팅, JSX 및 ES6까지의 최신 JS 구문 지원, JavaScript/JSX 및 TypeScript/TSX를 지원합니다. 또한 다른 JavaScript 번들러보다 최소 100배 빠릅니다
비어있지 않은 인터페이스(non-empty interfaces), 코드 생성(go generate)을 기반으로하는 ORM 툴입니다.
Go 디버거인 Delve의 1.5 버전이 릴리스 되었습니다.
MongoDB 공식 Go 라이브러리인 mongo-go-driver의 1.4 버전이 릴리스 되었습니다.
Docker 이미지 및 컨테이너에 관한 각종 메타데이터와 시스템 정보를 관리할 수 있는 CUI 툴입니다. docker-compose 또한 지원합니다.
sync/errgroup에 워커 (고루틴) 개수를 제한할 수 있는 기능이 추가된 래퍼 라이브러리입니다.
GoLand 2020.2 버전이 릴리스 되었습니다. Go 모듈에 관한 지원이 강화되었고, 1.15의 vet 워닝을 지원합니다. 또한 Go Playground 공유 기능 및 Go 2의 제네릭 실험 기능 지원등이 추가되었습니다.
Google의 인증서 투명성(Certificate Transparency), 폐기 투명성(Revocation Transparency) 관련 아이디어를 블록체인, 분산화 지원없이 만든 구현체 입니다.
Go WASM을 온라인에서 바로 실행할 수 있는 플레이그라운드입니다.
golang/x/text 패키지를 사용하여 국제화 (i18n)와 지역화 (i10n)을 구현하는 튜토리얼입니다. 여러 언어팩을 로드하여 요청된 언어에 대한 번역된 문장을 반환하는 간단한 웹서버를 구현하면서 설명하고 있습니다.
Goa라는 웹프레임워크를 사용하여 HTTP API를 구현해보는 튜토리얼입니다. Goa를 사용하면 gRPC처럼 DSL로 API 명세를 작성하여 CLI로 API의 스캐폴드를 자동 생성할 수 있습니다.
Go 생태계의 de-facto 디버거인 Delve를 소개하는 유튜브 튜토리얼 영상입니다. Delve의 설치부터 시작하여 예시 코드와 함께 Delve CLI를 사용한 디버깅 방법을 소개하고 있습니다.
Go 2의 실험 기능으로 들어온 제네릭의 기본 문법과 제안된 대체 문법등을 소개합니다. 여러 타입의 슬라이스를 순회하는 기능을 타입별 함수 분리, interface, reflection 및 제네릭으로 구현하면서 비교를 해봅니다.
위키피디아 데이터를 문서 데이터베이스로 사용하여 텍스트 토크나이징, 필터링, 역 인덱싱 및 검색 쿼리를 하나씩 만들어가면서 간단한 풀 텍스트 검색 엔진을 구현해봅니다.
Go로 WebAssembly 애플리케이션 만들어보는 튜토리얼입니다. Ebiten이라는 2D 게임 라이브러리를 사용해 만든 고전 탁구 게임을 WebAssembly로 빌드하여 웹브라우저에서 구동해봅니다.
도메인 주도 개발 (DDD)의 정의 및 방법론의 소개를 시작으로 DDD를 적용하여 Go로 마이크로 서비스를 개발하는 방법을 예제 코드 및 구조와 함께 설명하는 영상입니다.
Cobra를 사용한 CLI 개발 튜토리얼입니다. 테스트하기 어려웠던 기존의 CLI 개발 방식이 아닌 CLI 인터페이스와 비즈니스 로직을 분리하여 테스트하기 쉬운 구조로 만들었습니다.
Go 웹 프레임워크인 Fiber에서 gofiber/jwt 패키지를 사용하는 방법을 영상에서 소개합니다.
Go와 React를 사용하여 웹사이트를 구성합니다. 인증방식은 JWT로 구현하였습니다.
최신 기능보다 툴링, 테스트, 성능 및 장기적인 유지보수의 용이성이 더 중요하며, 잘만 사용한다면 Go의 내장된 툴링은 오랜시간동안 테스트된 기능을 제공하므로 더 나은 프로세스를 지원합니다.
JSON 언마샬링 속도를 2-3배, 토크나이징 속도를 8-10배 향상 시킨 경험에 관한 기술적인 내용을 상세하게 설명하고 있습니다. 기본적인 아이디어는 바이트나 토큰을 처리할 때 필요한 함수 호출 횟수를 줄이고 데이터 복사를 줄여 메모리 사용량과 오버헤드를 줄인다는 것입니다.
VPN이나 SSH 포워딩 없이 TLS 핸드셰이킹 과정에서 SNI를 읽어 접속하려는 인터널 서버에 곧바로 포워딩해주는 퍼블릭 프록시를 만든 경험기입니다.
Go 기반의 정적 웹사이트 생성기인 Hugo와 GitHub Actions CI를 연동하여 커밋할 때 자동으로 웹 사이트를 S3로 배포하는 방법을 소개합니다.
호환성 있는 Go 패키지를 작성하는 방법을 소개합니다. 함수 새로 만들기, 인터페이스 활용하기, 설정 메서드 추가하기 그리고 호환 가능한 구조체 작성하기라는 4가지 방법들에 대해 코드 예시와 함께 자세히 설명합니다.
expvar를 사용해 메트릭 디버깅용 미들웨어를 만드는 방법과 간단한 pprof 사용법을 소개합니다.
AmericanExpress의 Principal Engineer인 Benjamin Cane이 Go 패키지 구성방법을 설명합니다.
Go의 에러 핸들링 방식과 try catch 방식을 비교하여 error 값의 장점을 설명합니다. 글쓴이가 꼽는 가장 큰 장점은 에러 반환과 에러 처리 플로우가 굉장히 투명하기 때문에 에러가 발생하는 위치와 에러를 핸들링하는 코드를 명확히 읽고 작성할 수 있다는 것입니다.
"SSE2를 지원하려는데 386 아키텍처 유지보수 비용이 많이들어 해당 아키텍처를 삭제하자는 의견 GOARCH=386 Intel Pentium 4 (2000년 출시) or AMD Opteron/Athlon 64 (2003년 출시) "
Go가 데드락을 탐지하는 원리에 대해 간단히 소개하는 글입니다. 기본적인 탐지 방식은 모니터링용 스레드를 제외한 액티브 스레드의 개수와 idle 상태의 스레드의 개수가 같을 때 발생한다는 것입니다. 즉, 데드락의 정의대로 블로킹된 스레드를 언블로킹 해줄 스레드가 없을 경우 데드락이 발생합니다.
httptest.NewServer를 사용하여 HTTP 리퀘스트에 대한 유닛테스트를 작성하는 방법을 소개합니다.
애플의 실리콘 맥 발표를 보고 Go 어셈블러에서 ARM64 PopCount를 구현하는 내용입니다.
Context 패키지를 볼때마다 무엇인지 몰라서 두려움이 있었는데 context 소스파일을 읽으면서 이해해 나가는 글입니다.
Channel의 가능한 한 많은 사용 사례를 소개 및 설명해주는 글입니다. 채널을 활용한 알람, 뮤텍스, 락, 세마포어, Rate Limit 및 데이터 파이프라인등 아주 다양한 사용 사례를 실제 코드와 함께 소개합니다.
동일한 11개의 URL을 8가지 접근 방식으로 라우팅하는 것을 소개하며 각 방식에 대한 벤치마킹도 포함되어있습니다.
Robert Griesemer와 Ian Lance Tyalor가 Go 2에서 제안된 제네릭의 최신 업데이트 사항에 대해 토론을 하는 팟캐스트입니다.
Pace라는 회사에서 자체 개발한 Oto라는 Go 기반의 DSL과 코드 생성기로 API 코드를 자동 생성하여 API를 개발한다는 내용입니다. gRPC와 유사한 컨셉이며, 왜 protobuf + gRPC 대신 자체 코드 생성기를 개발했는지에 대한 이유도 설명합니다.
Audio From Scratch 시리즈는 Go를 사용하여 오디오 데이터를 조작 하는 방법을 살펴봅니다.
Google Kuberetes Engine에서 개인 GoDoc 서버를 배포하는 방법을 설명합니다.
저자는 예제를 통해 테스트를 작성하며 코드가 더 깨끗하고 간결해졌다고 설명합니다.
Onion Architecture는 소프트웨어 엔지니어가 데이터베이스 선택이나 사용자 인터페이스 작동방식 같은 외부 문제와 관련이 없는 core 컬렉션에서 비지니스 로직을 모델링하도록 안내합니다.
Client를 임베드한 구조체를 만들고 해당 구조체의 Do 메소드를 선언하여 모든 리퀘스트에 공통의 헤더를 추가하는 방법을 설명합니다.
Context.Value은 타입에 타입에 대한 안정성이 없기 때문에 논쟁의 여지가 있습니다. 해당 글은 새로운 제네릭 디자인을 기반으로 솔루션을 제안합니다.
Go의 기본 특성을 변경하지 않고 파라미터 타입을(parameterized types) 추가하여 제네릭을 구현합니다. 언어의 복잡성은 간결하게 유지하면서 읽기 쉽고, 배우기 쉬우며 관리가 용이한 언어를 지향합니다.
컨테이너의 기본 개념을 설명하고, 100줄 미만의 코드로 간단한 컨테이너를 구현합니다.
프로그래밍에서 난해하고 실수가 발생하기 쉬운 문제들을 Gotchas라고 하는데, 해당 글에서는 9개의 Gotchas 문제를 제시합니다.
고품질의 데이터베이스 통합 테스트를 위해 지켜야하는 4가지 규칙을 설명합니다.
- 테스트는 빨라야 한다.
- 모든 레벨에서 충분한 시나리오 테스트를 수행해야 한다.
- 테스트는 견고하고 결정론적이어야 한다.
- 모든 테스트는 로컬 환경에서도 실행할 수 있어야 한다.
정적 리소스를 바이너리에 임베딩할 수 있는 새로운 go:embed 명령어 (디렉티브)를 제안합니다. 정적 리소스를 위한 Go 파일을 생성하고 커밋하는 과정을 없애면서, 또한 정적 파일을 임베딩하는 통일된 방식을 지원합니다.
새로운 파일 시스템 추상화를 지원하는 io/fs패키지 제안합니다. 파일시스템 트리에 대한 공식적인 추상화를 지원하며, 초기 인터페이스는 읽기전용 파일 시스템으로 제한합니다.
Fuzzing이란 소프트웨어 테스트 기법으로 컴퓨터 프로그램에 유효한, 예상치 않은 또는 무작위 데이터를 입력하는 것입니다. 이 제안은 Go 테스트 파일에서 Fuzz 기능을 지원하여 통합된 end-to-end 지원을 통해 Go 개발자에게 Fuzzing을 퍼스트 클래스 옵션으로 만듭니다.
기존 build 태그 신택스의 모호함과 사용성을 개선한 go:build 태그를 제안하는 Draft Design입니다. OR과 AND 그리고 괄호 신택스를 사용하여 기존에는 한 눈에 파악하기 어려웠던 빌드 정책을 친숙한 신택스로 좀 더 쉽게 알아볼 수 있도록 개선합니다.