1

I am using golang and protocolbuffers. I have two proto messages where one imports the other. I would like to do some processing using proto.Message type but I get an error.

This is foo.proto

syntax = "proto3";
package foo;

message Page {
    string id = 1;
    string title = 2;
}

This is bar.proto where I am importing foo.proto

syntax = "proto3";
package bar;

import "foo.proto";

message Book {
    string id = 1;
    string title = 2;
    repeated foo.Page pages = 3;
}

I am using the following function to process Book. I want to keep it generic as my usecase requires to transform other proto messages as well.

func TransformArray (arrObj []proto.Message) {
    if len(proto) > 0 && !reflect.ValueOf(proto[0]).IsNil() {
        ...
    } 
}

When I use the above function in my go file as follows

package main

import (
    book_proto "book"
)

func main() {
    book = *book_proto.Book{Pages: ... }
    TransformArray(book.Pages)
}

I get a syntax error as follows

cannot use book.Pages (type []*"foo".Page) as type []proto.Message in argument to TransformArray 

What am I doing wrong?

andthereitgoes
  • 819
  • 2
  • 10
  • 24
  • 1
    See [Type converting slices of interfaces in go](https://stackoverflow.com/questions/12753805/type-converting-slices-of-interfaces-in-go). You may only pass a slice value of type `[]proto.Message` to `TransformArray`. You cannot pass slice value whose element type implements `proto.Message` (but is not `proto.Message`). – icza May 09 '18 at 15:40
  • Your code appears to be incomplete. The error message does not appear to correspond to any included code, as none of the code you have included attempts to call `TransformArray`. – Jonathan Hall May 09 '18 at 15:50

0 Answers0