Используйте массив структуры в прото

# #go #struct #proto

Вопрос:

Я не могу вызвать функцию gRPC из-за несоответствия типов

мой протофайл :

 message Analytics {
    fields ...
}


message AnalyticsSet {
    repeated Analytics analytics = 1;
}

service StatService {
    rpc MyMethod(AnalyticsSet) returns (<something>) {}
}
 

Теперь мне нужно позвонить в «Мой метод».

Мой текущий код :

 type Analytics struct {
    same fields as in proto : Analytics
}

analytics := make([]Analytics, 4)

// .. some modifications in analytics ...

_, err := c.MyMethod(context.Background(), analytics)
if err != nil {
    log.Fatalf("error: %s", err)
}
 

в файле Proto «AnalyticsSet» — это массив «Аналитики»
, а в коде Go «аналитика» — массив типа «Аналитика»
, но этого недостаточно для вызова «метода», и я сталкиваюсь с несоответствием типов..

Как я должен изменить код go ?

Комментарии:

1. Используете ли вы созданную прото структуру golang в своем коде или свою собственную структуру, которая соответствует именам полей в прото?

Ответ №1:

Вы должны использовать Analytics структуру, сгенерированную из файла proto, — вы не можете использовать свой собственный тип.

Вы можете сгенерировать необходимый код Go, используя protoc его вместе с вашим .proto файлом. Вот пример с установленными параметрами генерации gRPC: .

 $ protoc --go_out=. --go-grpc_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative analytics.proto
 

В вашем файле proto должен быть go_package установлен параметр, описывающий путь импорта Go, к которому принадлежит созданный вами код proto. Вам также потребуется установить утилиты генератора go / go-grpc, необходимые для protoc :

 $ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
 

Более подробную информацию можно найти в: