<p dir="auto">by <strong>krolaw</strong>:</p>
<pre class="notranslate">I think it may have been removed due to <a href="https://golang.org/issue/2771" rel="nofollow">issue #2771</a>.  But it really needs to be added
back for formatting of custom types, for consistency with MarshalJSON and MarshalJSON.

For example: <a href="http://play.golang.org/p/HUeL1bUnMz" rel="nofollow">http://play.golang.org/p/HUeL1bUnMz</a>

Getting the xml to work correctly, requires a convoluted inelegant solution, which
doesn't feel like Go at all.  While, the JSON part just works beautifully.</pre>
<p dir="auto">by <strong>TheBrokenToaster</strong>:</p>
<pre class="notranslate">One of the changes from Go 1.0 to Go 1.1 was that the size of an "int" was now
dependent on the native architecture of the CPU. In Go 1.0, the size of the
"len" and "cap" fields in a GoSlice was always 32-bits. However, in
Go 1.1, those fields could be 32-bits or 64-bits depending on architecture.

Similarly, when using the GoSlice struct with CGo, the size of "len" and
"cap" fields should be architecture dependent. Currently, it uses the
"int" type, in which C language gives no guarantee that it is architecture
dependent.

The _cgo_export.h header is currently (INCORRECT):
    typedef struct { char *p; int n; } GoString;
    typedef struct { void *data; int len; int cap; } GoSlice;

Instead it should be (CORRECT):
    typedef struct { char *p; GoInt n; } GoString;
    typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;

Note: The GoString struct happens to work due to data structure alignment, but will
still suffer from a integer overflow if the string length was greater than 2^32.

----

What steps will reproduce the problem?
    1.) Download the attachment.
    2.) Compile and run demo.go on a 64-bit machine


What is the expected output?
    sizeof(GoSlice): 16
      sizeof(GoSlice.data): 8
      sizeof(GoSlice.len): 4
      sizeof(GoSlice.cap): 4
    sizeof(GoString): 16
      sizeof(GoString.p): 8
      sizeof(GoString.n): 4

    Print length of each GoSlice element
      Index 0: len=0, cap=0
      Index 1: len=417792, cap=194
      Hexdump: 00400500c2000000 0000000000000000 2823000000000000 00600600c2000000

    Print length of each GoString element
      Index 0: len=10
      Index 1: len=16
      Index 2: len=18
      Hexdump: 9050430000000000 0a00000000000000 105a430000000000 1000000000000000 d052430000000000 1200000000000000


What do you see instead?
    sizeof(GoSlice): 24
      sizeof(GoSlice.data): 8
      sizeof(GoSlice.len): 8
      sizeof(GoSlice.cap): 8
    sizeof(GoString): 16
      sizeof(GoString.p): 8
      sizeof(GoString.n): 8

    Print length of each GoSlice element
      Index 0: len=0, cap=9000
      Index 1: len=123, cap=456
      Hexdump: 00400500c2000000 0000000000000000 2823000000000000 00600600c2000000 7b00000000000000 c801000000000000

    Print length of each GoString element
      Index 0: len=10
      Index 1: len=16
      Index 2: len=18
      Hexdump: 9050430000000000 0a00000000000000 105a430000000000 1000000000000000 d052430000000000 1200000000000000


Which compiler are you using?
    6g


Which operating system are you using?
    Linux Mint 14 Nadia


Which version are you using?
    go version go1.1 linux/amd64</pre>
<p dir="auto">Attachments:</p>
<ol dir="auto">
<li><a href="https://storage.googleapis.com/go-attachment/5646/0/cgo_bug.tar.gz" rel="nofollow">cgo_bug.tar.gz</a> (1253 bytes)</li>
</ol>