>  기사  >  백엔드 개발  >  값이 false인 경우 gRPC는 부울 값을 반환하지 않습니다.

값이 false인 경우 gRPC는 부울 값을 반환하지 않습니다.

PHPz
PHPz앞으로
2024-02-10 09:30:09487검색

如果值为 false,gRPC 不会返回布尔值

PHP 편집자 Baicao는 gRPC 사용을 소개할 때 gRPC 요청에서 지정된 값이 false인 경우 gRPC가 부울 값을 반환하지 않는다고 지적했습니다. 즉, gRPC를 사용할 때 혼동과 오류를 피하기 위해 반환 값을 어떻게 처리하는지 주의를 기울여야 한다는 의미입니다. 이 세부 사항을 이해하면 gRPC의 기능을 더 잘 이해하고 적용하고 프로그래밍 효율성과 코드 품질을 향상시키는 데 도움이 됩니다. 프로젝트에 더 나은 성능과 확장성을 제공하기 위해 gRPC의 더 많은 기능과 사용법을 살펴보겠습니다.

질문 내용

func (m *todoserver) gettodos(ctx context.context, empty *emptypb.empty) (*desc.gettodosresponse, error) {
    todos, err := m.todoservice.gettodos()
    if err != nil {
        return nil, err
    }

    todosresp := make([]*desc.gettodosresponse_todo, 0, len(todos))
    for _, todo := range todos {
        todosresp = append(todosresp, &desc.gettodosresponse_todo{
            id:          todo.id,
            title:       todo.title,
            iscompleted: todo.iscompleted,
        })
    }

    return &desc.gettodosresponse{todos: todosresp}, nil
}
service TodoService {
    rpc GetTodos(google.protobuf.Empty) returns (GetTodosResponse) {}
}

message GetTodosResponse {
    repeated Todo todos = 1;
    message Todo {
        int64 id = 1;
        string title = 2;
        bool is_completed = 3;
    }
}
service TodoService {
    rpc GetTodos(google.protobuf.Empty) returns (GetTodosResponse) {}
}

message GetTodosResponse {
    repeated Todo todos = 1;
    message Todo {
        int64 id = 1;
        string title = 2;
        bool is_completed = 3;
    }
}

데이터베이스에 기록이 있습니다 |번호 |제목 |완료 | |-|-|-| |1 |아아아|거짓|

위 함수는 {"todos": [{"id": "1", "title": "aaa"}]} 但一旦我将 is_completed 更改为 true ,结果是正确的 {"todos ": [{"id": "1", "title": "aaa", "iscompleted": true}]}

Solution

이를 반환합니다. 이는 의도적으로 설계된 것이며 효율성을 향상시키기 위한 것입니다.

bool 的“零”值是 false - 因此,当使用 false 值初始化 protobuf 结构时,在使用标准库的 encoding/json 解组器时不需要显式声明该字段。在编码端,如果字段的 json 标记包含 omitempty 限定符,则标准库的 encoding/json 마샬러는 0 값을 제거합니다. 이것이 바로 여러분이 보는 것입니다. title 字符串字段是 ""(즉, 문자열의 0 값)인 경우에도 동일한 동작을 볼 수 있습니다.

생성된 코드 보기(*.pb.go),结构体的 bool 필드 정의는 다음과 같습니다.

으아악

따라서 json:"...,omitempty" 指示 encoding/json 마샬러는 이러한 태그를 사용하여 마샬링하는 동안 0 값을 생략합니다.

이 동작을 재정의하려면:

  • 생성된 코드에서 omitempty 지시문을 제거할 수 있습니다(권장되지 않음 - 개발 수명 주기 동안 편집을 관리해야 하기 때문에). 하지만 꼭 해야 한다면 이 답변;
  • 을 참조하세요.
  • grpc-gateway을 사용하는 경우 런타임에 재정의하세요. 예:
으아악
  • 또는 표준 라이브러리를 사용하지 않고 json을 직접 내보내는 경우(encoding/json),而是使用此包中的 json 封送拆收器 "google.golang.org/protobuf/encoding/protojson":
으아악

이 답변에서 언급한 바와 같습니다.

위 내용은 값이 false인 경우 gRPC는 부울 값을 반환하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제