Go 57

Go 언어에서 nil 포인터로 인한 오류를 미리 잡는 방법: 정적 분석 도구 활용법

Go 언어에서 nil 포인터로 인한 오류를 미리 잡는 방법: 정적 분석 도구 활용법Go 언어에서 nil 포인터로 인한 오류를 정적 분석으로 잡아내는 방법Go 언어를 사용하다 보면 nil로 인한 오류는 자주 접하는 문제 중 하나인데요. 특히 nil 포인터와 nil 인터페이스의 차이로 인해 발생하는 문제는 디버깅하기 쉽지 않습니다. 이번 글에서는 정적 분석을 통해 이러한 오류를 미리 찾아내는 방법을 소개하려고 합니다. 이를 통해 코드에서 발생할 수 있는 잠재적인 문제를 미리 예방할 수 있겠죠.문제 상황: nil인데 nil이 아닌 이유먼저 아래 코드를 실행해보세요.package mainimport "fmt"type MyErr struct{}func (*MyErr) Error() string { retur..

Go 2024.09.20

Go 언어에서 Templ 또는 일반 템플릿: 무엇을 선택해야 할까요?

Go 언어에서 Templ 또는 일반 템플릿: 무엇을 선택해야 할까요?Go 언어로 웹 개발을 진행하다 보면 템플릿 엔진 선택에 대해 고민하게 되는데요. 오늘은 Templ과 기본 html/template 중 어떤 것을 사용하는 것이 좋을지 함께 알아볼까요?Templ이란 무엇인가요?Templ은 Go 언어를 위한 템플릿 엔진으로, 정적인 타입 검사와 컴파일 타임 오류 감지를 제공하여 안전하고 효율적인 템플릿 작성을 도와줍니다. 일반적인 템플릿 엔진보다 더욱 깔끔하고 유지보수가 쉬운 코드를 작성할 수 있다는 장점이 있는데요. 하지만 새로운 의존성을 추가하는 데에는 항상 고민이 따르는데요. 개발이 중단되거나 지원이 부족해질 수 있다는 우려 때문입니다.Templ의 장단점은 무엇일까요?장점컴파일 타임 검사: Templ..

Go 2024.09.19

Go 언어에서 구조체 필드를 반드시 지정하여 초기화하는 방법 알아볼까요?

Go 언어에서 구조체 필드를 반드시 지정하여 초기화하는 방법 알아볼까요?Go 언어를 사용하다 보면 구조체(struct)를 초기화할 때 모든 필드를 반드시 명시적으로 지정하도록 강제하고 싶은 경우가 있는데요. 기본적으로 Go에서는 구조체를 초기화할 때 필드를 생략하면 해당 필드들은 제로 값(zero value)으로 초기화됩니다. 즉, 포인터는 nil, 불리는 false, 문자열은 "" 등으로 자동 설정되는데요. 이는 때때로 개발자에게 의도치 않은 결과를 가져올 수 있습니다. 그렇다면 구조체를 인스턴스화할 때 모든 필드를 반드시 명시적으로 선언하도록 강제할 수 있는 방법이 있을까요? 오늘은 이 문제를 해결하기 위한 몇 가지 방법과, 왜 Go에서 이러한 동작을 기본으로 채택했는지에 대해 알아보겠습니다.필드를 ..

Go 2024.09.19

Go 언어 time.Timer#Reset() 완벽 가이드: 올바른 사용법 알아볼까요?

Go 언어 time.Timer#Reset() 완벽 가이드: 올바른 사용법 알아볼까요?Go 언어에서 time.Timer를 사용하고 계신가요? 매우 기본적인 요소인데도 올바르게 사용하는 것은 의외로 어렵습니다. 얼마 전에 직접 겪은 사례와 함께 그 올바른 사용법을 소개하려고 합니다.TL;DRtime.Timer#Stop() 후에는 time.Timer.C를 읽어서 남은 값을 버려야 할 때가 있습니다.ti := time.NewTimer(5 * time.Second)// ...if !ti.Stop() { time.Timer#Reset()은 타이머가 정지된 상태에서 호출해야 합니다.// ...if !ti.Stop() { 타이머에 대한 이러한 조작은 동시에 실행하면 안 됩니다.Stop()의 올바른 사용법앞서..

Go 2024.09.19

Go 언어에서 chan chan 즉, 채널을 채널로 주고받기

Go 언어에서 chan chan 즉, 채널을 채널로 주고받기Go 언어에서 채널을 채널로 주고받을 수 있다는 것, 알고 계신가요? 의외로 편리해서 몇 가지 사용 예를 소개하려고 합니다.사용 예 1: Request/Response 패턴채널은 일반적으로 단방향 데이터 전달을 하지만, 채널을 이중으로 사용하면 응답을 받을 수 있는데요. 예를 들어, 처리 결과의 error를 받고 싶다면 chan chan error를 사용할 수 있습니다.reqc := make(chan chan error) 요청을 보내는 쪽에서는 chan error를 만들어서 chan chan에 전송합니다. 이 채널로 결과가 돌아오며, 결과가 반환될 때까지 블록됩니다.ch := make(chan error)reqc  요청을 받는 쪽에서는 받은 채널..

Go 2024.09.19

Go 실행 파일에 ZIP으로 리소스 임베딩하기: 간단하게 알아볼까요?

Go 실행 파일에 ZIP으로 리소스 임베딩하기: 간단하게 알아볼까요?시작하며ZIP을 사용하여 실행 파일에 리소스를 임베딩하는 방법을 소개하려고 한데요. 실제로 Go의 archive/zip, zip 명령어, cat 명령어(확인을 위해 unzip 명령어도 함께)를 사용하여 리소스를 임베딩하는 예제를 설명해드리겠습니다.Go에서 리소스 임베딩Go로 애플리케이션을 개발할 때, CSS, JavaScript, 이미지, 템플릿 등의 리소스를 실행 파일과 별도로 배치하거나 실행 파일에 임베딩해야 합니다. 리소스를 임베딩하는 방법에는 코드 제너레이터를 사용하는 방법과 ZIP을 사용하는 방법이 있는데요.코드 제너레이터리소스 임베딩에서 자주 소개되는 방법은 코드 제너레이터를 사용하여 리소스를 Go 소스 코드로 변환하는 것입니..

Go 2024.09.19

Go 언어 fmt.Printf 완벽 가이드

Go 언어 fmt.Printf 완벽 가이드: 이제 두렵지않은 printf 사용법 알아볼까요?Go 언어를 사용하다 보면 fmt 패키지의 printf 계열 함수들을 자주 만나게 한데요. 이번에는 Fprintf, Printf, Sprintf 함수들의 포맷 지정 방법에 대해 자세히 알아보겠습니다.모든 타입에 사용할 수 있는 verb%v값을 기본 형식으로 출력합니다.기본 타입의 경우타입verb논리값 (bool)%t부호 있는 정수 (int, int8 등)%d부호 없는 정수 (uint, uint8 등)%d부동소수점수 (float64 등)%g복소수 (complex128 등)%g문자열 (string)%s채널 (chan)%p포인터 (pointer)%ppackage mainimport ( "fmt")func main(..

Go 2024.09.19

Go로 CUI 툴을 쉽고 편하게! gocui 사용기

Go로 CUI 툴을 쉽고 편하게! gocui 사용기안녕하세요. 요즘 Go로 CUI·CLI 툴을 만드는 것에 푹 빠져 있는데요. CUI 툴을 만들 때 사용하고 있는 라이브러리로 gocui라는 것이 있습니다.어떤 건가요?터미널 상에서 HTML의 폼(form)처럼 입력 인터페이스를 간단하게 만들 수 있습니다. 버튼이나 체크박스 등도 준비해두었는데요.사용 방법[_demos Github 예제](https://github.com/skanehira/gocui-component/tree/master/_demos에 있는 select 샘플을 바탕으로 설명해보겠습니다.func main() { gui, err := gocui.NewGui(gocui.Output256) if err != nil { pan..

Go 2024.09.19

AriaSQL: Go 언어로 만든 새로운 관계형 데이터베이스의 탄생

AriaSQL: Go 언어로 만든 새로운 관계형 데이터베이스의 탄생안녕하세요! 오늘은 AriaSQL이라는 새로운 오픈 소스 관계형 데이터베이스 시스템에 대해 알아볼까요? 이 시스템은 전적으로 Go 언어로 작성되었으며, 개발자가 지난 7개월 동안 열심히 연구하고 구현해온 프로젝트입니다. AriaSQL의 현재 진행 상황과 앞으로의 계획에 대해 살펴보도록 하죠. https://github.com/ariasql/ariasql GitHub - ariasql/ariasql: The AriaSQL relational database management system.The AriaSQL relational database management system. - ariasql/ariasqlgithub.com AriaSQL..

Go 2024.09.07

Argon/Bcrypt가 CPU를 100% 사용하는 이유와 해결책

Argon/Bcrypt가 CPU를 100% 사용하는 이유와 해결책안녕하세요! 오늘은 Argon/Bcrypt 해시 함수가 사용자의 비밀번호를 해시할 때 CPU 사용량이 100%에 달하는 이유와 이 문제를 해결하기 위한 방법에 대해 알아볼까요? 이 문제는 특히 많은 사용자가 동시에 로그인하거나 회원가입을 시도할 때 서버에 큰 부담을 줄 수 있는데요. 어떤 문제인지 구체적으로 살펴보도록 하죠. 문제의 배경현재 여러분의 Golang 애플리케이션에서 Argon/Bcrypt 해시 함수를 사용하여 비밀번호를 해시하고 있다고 가정해봅시다. Argon/Bcrypt는 보안성이 뛰어난 해시 알고리즘으로, 비밀번호를 안전하게 저장하기 위해 설계되었습니다. 그러나 사용자가 비밀번호를 해시하는 과정에서 CPU 사용량이 100%에..

Go 2024.09.07