My first question would be, is the type encoded into the CBOR blob somehow? 
Like by a tag? 

If structs are encoded as maps, with no type information, then the input 
doesn't have enough information to do what you want. How could the blob 
(using JSON notation)

   {"X": 1, "Y": 2}

know whether it should decode into

    type Point struct { X, Y int}

or 

    type Chromosome {X, Y int}

?

You have to encode the type somehow. If you control the encoding process 
and you're encoding a fixed set of types that you want to distinguish at 
decode time,
you can do something like this:

  type (
      This ...
      That ...
      TheOther ...

      Thing struct {
         This *This
         That *That
         TheOther *TheOther
     }
 )

To encode a `This` named `t`, actually encode `Thing{This: &t}`. When you 
decode that into a `Thing`, only the `This` field will be non-nil, so you 
know you've got a `This`.

(Disclaimer: I know this technique works with the encoding/json package; I 
can't guarantee it works with the cbor package you're using because I'm not 
familiar with it,
but if it behaves like encoding/json, you should be OK.)

On Wednesday, July 8, 2020 at 3:44:36 PM UTC-4, David Stainton wrote:
>
>
> Greetings,
>
> Similar questions have been asked in the past and I've read those posts... 
> and I believe I'm asking something different here.
>
> I'm using length prefixed CBOR over unix domain socket as my wire format. 
> However the reader doesn't known which CBOR type it needs to decode.
> I'd like a mechanism similar to the golang switch type assertion where a 
> known set of types are specified.
>
> Before you go and tell me to use the empty interface let me explain that 
> certainly this works:
>
> // "github.com/fxamacker/cbor"
> var v interface{}
> err = cbor.Unmarshal(out, &v)
>
> It works for some definitions of "works". It doesn't tell me what type it 
> is but it does allow me to access each struct field by name in the map of 
> type: map[interface {}]interface {}
>
> The reason this is not good enough is that it doesn't concretely tell me 
> the type!
> Of course I could go ahead and add a struct field called TypeName and set 
> it's value to a string encoding the name. But that feels wrong and I'd feel 
> bad after writing it.
>
> I've also tried to ask this question on a ticket here:
> https://github.com/fxamacker/cbor/issues/241
>
> Is the least incorrect solution to iteratively try cbor.Unmarshal with all 
> the types in the known set of possible types until one of them works?
>
> Certainly this problem isn't specific to CBOR. Am I asking the question 
> incorrectly here?
>
>
> Sincerely,
> David
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/019fb798-f282-451d-947c-79a7c1bc2b98o%40googlegroups.com.

Reply via email to