Go: Should I Use a Pointer instead of a Copy of my Struct?
Published in
5 min readMay 12, 2019
For many Go developers, the systematic use of pointers to share structs instead of the copy itself seems the best option in terms of performance.
In order to understand the impact of using a pointer rather than a copy of the struct, we will review two use cases.
Intensive allocation of data
Let’s take a simple example of when you want to share a struct for its values:
type S struct {
a, b, c int64
d, e, f string
g, h, i float64
}
Here is a basic struct that can be shared by copy or by pointer:
func byCopy() S {
return S{
a: 1, b: 1, c: 1,
e: "foo", f: "foo",
g: 1.0, h: 1.0, i: 1.0,
}
}
func byPointer() *S {
return &S{
a: 1, b: 1, c: 1,
e: "foo", f: "foo",
g: 1.0, h: 1.0, i: 1.0,
}
}
Based on those 2 methods, we can now write 2 benchmarks, one where the struct is passed by copy:
func BenchmarkMemoryStack(b *testing.B) {
var s S
f, err := os.Create("stack.out")
if err != nil {
panic(err)
}
defer f.Close()
err = trace.Start(f)
if err != nil {
panic(err)
}
for i := 0; i < b.N; i++ {
s = byCopy()
}
trace.Stop()
b.StopTimer()
_ =…