# #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
Более подробную информацию можно найти в: