반응형

Golang을 사용하다보면 임시 구조체를 사용하면 생각보다 유연하고 편하게 작업 할 수 있다.

 

함수 내에 스택에 할당됨으로 함수내에서만 사용가능하다. 일반적으로 사용하는 구조체와의 차이점이라고 할 수 있다.

 

type Test struct{
 TestId string
}

func Tt(){
 t := &Test{}
}

일반적으로는 위와같은 방법으로 구조체를 생성하고 사용하지만 다음과 같이 사용하면 구조체를 임시로 사용가능하다.

 

func Tt(){
 var Test struct{
    TestId String
 }
 
 t := &Test{}
 
}

위와 같이 함수내에 구조체를 정의 하여 사용할 수 있고, 슬라이스로도 사용이 가능하다.

 

활용방안은 데이터베이스를 사용할때 ORM 은 각 테이블에 관한 정보는 제대로 가져오나 (grom) join 과 같은 상황에선 제대로 결과 값을 가져오지 못하는 경우가 발생이 되는데 이럴때 임시 구조체를 사용한다면 원하는 결과 값을 보다 쉽게 가져 올 수 있다.

 

gorm은 다음 포스팅 부터 연재 하는걸로~

반응형

'개발 > Go' 카테고리의 다른 글

[문법] 임시 구조체  (0) 2022.05.13
[gRPC/gRPC GATEWAY] json 필드 이름 proto 타입이름과 다를때  (0) 2022.05.12
[gRPC] message oneof 사용  (0) 2022.05.11
반응형

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 처리를 어떻게 하면 좋을까?

 

Go에서 gRPC는 Get 함수를 자동으로 지원해 줌으로 GetAdminId() 와 GetUserId()를 사용하여 값을 가져 올 수 있는데 위 함수로 결과 값을 가져와 처리하기에는 oneof를 사용하는 의미가 없어진다. 

 

사실 oneof를 사용하는 이유가 여러 필드 중 1개만 사용함으로써 Serialize된 데이터 패킷의 수도 줄일 수 있는 장점이 있다. 그렇기에 사용 할 수 있는 부분은 사용하는 것이 이득이라 생각한다.

 

대게 많이 사용하는 방법이 무엇이 있을까 찾아봤는데 마땅히 없어 생각해본 처리 방법이다.

 

더 나은 방법이 있다면 답글 부탁 드리겠습니다.

func (x *XX) XXXX(ctx context.Context, request *pb.Test) (*pb.Test, error){
 switch v := request.GetIdOneOf().(type){
 case *pb.Test_AdminId:
  fmt.Println(v)
 case *pb.Test_UserId:
  fmt.Println(v)
 
 }
 
 ... 중간 생략
 
}

내가 생각한것은 oneof를 가져와서 직접 타입 체크를 한다면 oneof를 효과적으로 사용 할 수 있는 것 같다.

반응형

'개발 > Go' 카테고리의 다른 글

[문법] 임시 구조체  (0) 2022.05.13
[gRPC/gRPC GATEWAY] json 필드 이름 proto 타입이름과 다를때  (0) 2022.05.12
[gRPC] message oneof 사용  (0) 2022.05.11

+ Recent posts