Now fasten your seatbelts, we talk about one of the concepts, which make people think go is complicated.
You go to a theatre. There you hand in your coat at the cloakroom. You get a receipt saying “your coat is on hook 42”.
Now the receipt is a pointer to the coat. You can make a copy of the receipt, but there is still only one coat.
That’s all there is to it!
Pointers are all about efficiency. A pointer to a complex data structure is faster to handle than to copy the structure.
6 coat := "I am a coat" 7 receipt := &coat 8 9 receipt2 := &coat 10 11 fmt.Println(*receipt) 12 fmt.Println(*receipt2)
With this code you will get this output:
I am a coat I am a coat
This is because receipt and receipt2 pointing to the same coat.
& means “give me the address of the variable”. So this is de-referecing. The memory address ist the place where the data is stored.
* means tread this as a pointer. So
*receipt fetches the address stored in
receipt and uses the content which is stored there.
If you just do:
you will get number like
0xc000010230, which is the memory address.
14 var anotherCoat string 15 anotherCoat = "I am the red coat" 16 17 var redReceipt *string 18 redReceipt = &anotherCoat 19 fmt.Println(*redReceipt) 20 21 redReceipt = &coat 22 fmt.Println(*redReceipt)
A string pointer can reference different strings in the lifetime. In line 18 redReceipt gets the address from anotherCoat. After that in line 21 its gets the address of coat.
So the output is:
I am the red coat I am a coat
Because in line 19 the red coat is referenced and in line 22 the coat.
See the full source on github.