title: Map C struct with union field to Go struct
body: <p>I'm getting results from syscall to some WinApi in Go. I map simple structs from C code easily, but how to deal with C structs like the following?</p>
  
  <pre><code>typedef struct SPC_LINK_
  {
      DWORD dwLinkChoice;
  #               define          SPC_URL_LINK_CHOICE         1
  #               define          SPC_MONIKER_LINK_CHOICE     2
  #               define          SPC_FILE_LINK_CHOICE        3
  
      union
      {
          LPWSTR                  pwszUrl;
          SPC_SERIALIZED_OBJECT   Moniker;
          LPWSTR                  pwszFile;
      };
  
  } SPC_LINK, *PSPC_LINK;
  </code></pre>
  
  <p>If all possible types are defined in Go</p>
  
  <pre><code>type SPC_LINK struct {
      dwLinkChoice  DWORD
      Moniker       SPC_SERIALIZED_OBJECT
      pwszFile      LPWSTR
      pwszUrl       LPWSTR
  }
  </code></pre>
  
  <p>after the syscall with <code>unsafe.Pointer</code> to this Go struct as a parameter, I've got it in memory and can access it in Go as usual, but only the first field after <code>dwLinkChoice</code> (<code>Moniker</code> in the code above) is always filled, the other two are always empty. I know this is expected behavior in C, as you can have only one union field at a time. Taking this into account, should I ignore the whole union structure and have some sort of a placeholder in my Go struct?</p>
  
  <pre><code>type SPC_LINK struct {
      dwLinkChoice  DWORD
      dwLink        uintptr // a placeholder, will hold any possible value
  }
  </code></pre>
  
  <p>I set type for the placeholder to uintptr, but what if the original C structure has some other non-pointer types in the union block? I'm really not sure how to handle C unions and looking for any suggestions.</p>