Как пометить поле в gRPC, которое клиенту нельзя использовать

«Как пометить поле в gRPC, которое клиенту нельзя использовать» — вопрос из категории Сети, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В gRPC (Protocol Buffers) можно пометить поле как deprecated или зарезервированное, но явного запрета на использование нет. Однако можно добавить комментарий и валидацию на стороне сервера:

message Request {
  string normal_field = 1;
  string internal_only_field = 2 [deprecated = true]; // Клиенты не должны использовать это поле
}

На сервере:

func (s *Server) SomeMethod(ctx context.Context, req *pb.Request) (*pb.Response, error) {
    if req.InternalOnlyField != "" {
        return nil, status.Error(codes.InvalidArgument, "internal_only_field is for internal use only")
    }
    // ...
}

Также можно использовать резервирование номеров полей:

reserved 2; // internal_only_field
reserved "internal_only_field";

Это предотвратит случайное использование поля в новых версиях.