Search code examples
gocassandragocql

Gocql custom marshaller


I have a table with a tuple column that is made up of an int64 paired with a uuid:

CREATE TABLE ks.mytable {
    fileid    frozen <tuple <bigint, uuid>>,
    hits      counter,
    ...

and I can currently set the field using a cql statement like:

UPDATE ks.mytable hits = hits + 1 WHERE fileid=(? ?);

and I pass in 2 variables as arguments, an int64 and a gocql.UUID.

Instead of moving 2 variables around everywhere, I want to put these in a struct, something like

type MyID struct {
    id  int64
    uid  gocql.UUID
}

then use a Marshaller to pass these into the UPDATE statement.

Is this possible? I am not sure if I can pass in a single variable for the tuple field. If so, how can I do this? I can't figure out how - I was trying to mimic https://github.com/gocql/gocql/blob/master/marshal_test.go#L935 but I'm getting errors where I can't set the fields in the struct (cannot refer to unexported field or method proto)


Solution

  • As you mentioned, you are getting the following error:

    cannot refer to unexported field or method proto

    This means you need to export your fields inside the struct and that means beginning with a capital letter in Go. So your struct should be:

    type MyID struct {
        Id  int64
        Uid  gocql.UUID
    }
    

    Then, it should work.