1# structlayout 2 3The _structlayout_ utility prints the layout of a struct – that is the 4byte offset and size of each field, respecting alignment/padding. 5 6The information is printed in human-readable form by default, but can 7be emitted as JSON with the `-json` flag. This makes it easy to 8consume this information in other tools. 9 10A utility called _structlayout-pretty_ takes this JSON and prints an 11ASCII graphic representing the memory layout. 12 13_structlayout-optimize_ is another tool. Inspired by 14[maligned](https://github.com/mdempsky/maligned), it reads 15_structlayout_ JSON on stdin and reorders fields to minimize the 16amount of padding. The tool can itself emit JSON and feed into e.g. 17_structlayout-pretty_. 18 19_structlayout-svg_ is a third-party tool that, similarly to 20_structlayout-pretty_, visualises struct layouts. It does so by 21generating a fancy-looking SVG graphic. You can install it via 22 23``` 24go get github.com/ajstarks/svgo/structlayout-svg 25``` 26 27## Installation 28 29See [the main README](https://github.com/dominikh/go-tools#installation) for installation instructions. 30 31## Examples 32 33``` 34$ structlayout bufio Reader 35Reader.buf []byte: 0-24 (24 bytes) 36Reader.rd io.Reader: 24-40 (16 bytes) 37Reader.r int: 40-48 (8 bytes) 38Reader.w int: 48-56 (8 bytes) 39Reader.err error: 56-72 (16 bytes) 40Reader.lastByte int: 72-80 (8 bytes) 41Reader.lastRuneSize int: 80-88 (8 bytes) 42``` 43 44``` 45$ structlayout -json bufio Reader | jq . 46[ 47 { 48 "name": "Reader.buf", 49 "type": "[]byte", 50 "start": 0, 51 "end": 24, 52 "size": 24, 53 "is_padding": false 54 }, 55 { 56 "name": "Reader.rd", 57 "type": "io.Reader", 58 "start": 24, 59 "end": 40, 60 "size": 16, 61 "is_padding": false 62 }, 63 { 64 "name": "Reader.r", 65 "type": "int", 66 "start": 40, 67 "end": 48, 68 "size": 8, 69 "is_padding": false 70 }, 71... 72``` 73 74``` 75$ structlayout -json bufio Reader | structlayout-pretty 76 +--------+ 77 0 | | <- Reader.buf []byte 78 +--------+ 79 -........- 80 +--------+ 81 23 | | 82 +--------+ 83 24 | | <- Reader.rd io.Reader 84 +--------+ 85 -........- 86 +--------+ 87 39 | | 88 +--------+ 89 40 | | <- Reader.r int 90 +--------+ 91 -........- 92 +--------+ 93 47 | | 94 +--------+ 95 48 | | <- Reader.w int 96 +--------+ 97 -........- 98 +--------+ 99 55 | | 100 +--------+ 101 56 | | <- Reader.err error 102 +--------+ 103 -........- 104 +--------+ 105 71 | | 106 +--------+ 107 72 | | <- Reader.lastByte int 108 +--------+ 109 -........- 110 +--------+ 111 79 | | 112 +--------+ 113 80 | | <- Reader.lastRuneSize int 114 +--------+ 115 -........- 116 +--------+ 117 87 | | 118 +--------+ 119``` 120 121``` 122$ structlayout -json bytes Buffer | structlayout-svg -t "bytes.Buffer" > /tmp/struct.svg 123``` 124 125![memory layout of bytes.Buffer](/images/screenshots/struct.png) 126