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를 사용한다면 필드이름이랑 json으로 변환할때 큰 신경을 안써도 된다. 적어도 내가 하는 프로젝트에선 하지만 gRPC를 HTTP 통신을 하고싶다면 요청은 큰 문제가 없지만 응답을 받을때 우리가 예상한 키 값으로 넘어 오지 않는다. 가령 message Test{ string first_name = 1; ==> JSON firstName string last_name = 2; ==> JSON lastName } 위와 같이 _ 가 camelCase형식으로 바뀌디 때문에 예상한 응답이 아닐 경우가 있다. 이럴때는 gRPC gateway 의 ServeMux에 옵션을 추가해주면 해결된다. gwMux := runtime.NewServeMux( runtime.WithMarshalerOption(runt..
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..