Are using pointers the most memory/processor efficient way to pass structs for modification like below or is there a better way?
In Go, using pointers to pass structs for modification is the idiomatic way to do it. There are no reference variables as there are in other languages. So passing a pointer is the most efficient way to do it now and since it is idiomatic, will most likely be so in future versions of Go as well.
Basically there are 2 ways to pass parameters to a function or method: by value and by address (pointer).
Passing a parameter by value makes a copy of the passed value and so if you would modify it, it would modify the copy and not the original value. So if you want to modify the original value, that leaves you only the passing by address option.
Notes:
Note that you could also pass by value and return the modified copy and assign the returned modified value to the variable, but obviously this is less efficient - especially if the struct is large (contains many fields).
In rare cases there might be more efficient ways to pass a value for modification, but I would rather name these cases "denote" rather than pass. Let's assume you have a global variable, being a slice of structs. In this case you could just pass the index of the value in the slice you want to modify. And your function could just do the modification of the field of the element denoted by the passed index value. If you just want to modify 1 field, this may be faster and on 32-bit architecture the size of the index value may be smaller than the pointer, and this way you could spare the address taking and dereferencing operations (needs benchmark). But the usability of the function would drop drastically, so I don't recommend this.
That leaves passing by pointer the optimal way in case you need to modify it.