README.md
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