go 가 1.22 버전이 추가 됐다. 가장 반길 부분은 loop에서 변수 캡쳐부분이다. go를 처음 배울때 가장 의아 하면서도 이해가 잘안됐던 부분이지만 생각보다 인지를 하고 사용해야한다는 강박에 goroutine을 사용할때 방법을 생각 해야했었다. 쉽게 말하자면 for i := 0; i < 10; i++ { go func() { fmt.Println(i) }() } 위와 같은 프로그램을 실행 시킨다면 다른 언어에서는 순서는 보장하지 않지만 0,1,2,3,4,5,6,7,8,9 가 출력될 것이고 go에서도 그렇게 될거 같지만 그렇지 않다. 가장 나중의 i의 값이 캡쳐가 돼서 10이 10번 출력된다. 이를 해결 하기 위한 방법은 i := i 이런식으로 재할당을 해주거나. go func(i int) { }(i..
Go 에서 http 요청을 하거나 내부 프로세스에서 요청을 할때 실패할 경우 다시 재시도 하는 패키지를 찾았다. 패키지는 github.com/avast/retry-go/v4 을 사용했고 가장 많은 star 를 보유하고 있는것 같다. 사용 방법은 다음과 같다. func TestRetryStrategy(t *testing.T) { retryOptions := []retry.Option{ retry.Attempts(uint(3)), // 재시도 3번 retry.LastErrorOnly(true), // 여러 에러중 가장 마지막 에러를 출력 retry.RetryIf(func(err error) bool { // 에러의 종류에 따라 중단할지 시작할지 결정 return true }), } count := 0 str..
Golang을 사용하다보면 임시 구조체를 사용하면 생각보다 유연하고 편하게 작업 할 수 있다. 함수 내에 스택에 할당됨으로 함수내에서만 사용가능하다. 일반적으로 사용하는 구조체와의 차이점이라고 할 수 있다. type Test struct{ TestId string } func Tt(){ t := &Test{} } 일반적으로는 위와같은 방법으로 구조체를 생성하고 사용하지만 다음과 같이 사용하면 구조체를 임시로 사용가능하다. func Tt(){ var Test struct{ TestId String } t := &Test{} } 위와 같이 함수내에 구조체를 정의 하여 사용할 수 있고, 슬라이스로도 사용이 가능하다. 활용방안은 데이터베이스를 사용할때 ORM 은 각 테이블에 관한 정보는 제대로 가져오나 (gro..
gRPC 는 통신을 할때 protobuf 를 사용하는데 gRPC를 사용하기전 tcp 통신으로 protobuf를 파이썬에서 만 사용해봤었다. 이번 프로젝트에서 gRPC를 사용하게 되면서 gRPC Gateway 통신에도 oneof 를 사용해 보려고 한다. 아직 protobuf 자체를 Go에서 사용해 본것이 아니고 gRPC에서만 테스트한 예제이다. message Test{ int64 admin_id = 1; int64 user_id = 2; } 만약 위와같은 필드를 사용하는데 둘중 하나의 필드만 사용한다면 oneof 키워드를 사용할 수 있다. message Test{ oneof id_oneof{ int64 admin_id = 1; int64 user_id = 2; } } 그렇다면 Go에서 위와 같은 oneof..