Pointers
* operator before type is means pointer, while standing before pointer variable it calls dereferencing operator and means take value of pointed memory address. & means addressof:
func main() {
var a int = 1
var b *int = &a
// output: 1, 0xc0000b8000
fmt.Println(a, b)
// outputL 1, 1
fmt.Println(a, *b)
}
To change value of pointed variable need to dereference:
func main() {
var a int = 1
var b *int = &a
*b = 2
// output: 2 2
fmt.Println(a, *b)
}
Dereference operator has lower priority than dot so while dereferencing pointer to struct need to use brackets:
type Album struct {
name string
year int
}
func main() {
a := Album{name: "Back in black", year: 1980}
b := &a
(*b).year = 1979
// Output: {Back in black 1979} {Back in black 1979}
fmt.Println(a,*b)
// Also there is syntax sugar for structs, you can omit brackets with dereferencing operator:
c := &a
c.year = 1980
// Output: {Back in black 1980} {Back in black 1980} {Back in black 1980}
fmt.Println(a, *b, *c)
}