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)
}