Increment, Decrement и String() на разных ресиверах

ЗадачаMiddle5 минбесплатночто выведет и почему01-t025

У структуры три метода: Increment с ресивером-указателем, Decrement с ресивером-значением и String(). В main сначала вызывают Increment, потом Decrement. Почему число увеличится, но не уменьшится? Что напечатают fmt.Println(c) и fmt.Println(&c), если String() объявлен на указателе? А если на значении?

main.gogo
1package main2 3import "fmt"4 5type Counter struct{ n int }6 7func (c *Counter) Increment() { c.n++ }8 9func (c Counter) Decrement() { c.n-- }10 11func (c *Counter) String() string { return fmt.Sprintf("Counter(%d)", c.n) }12 13func main() {14	c := Counter{}15	c.Increment()16	c.Decrement()17	fmt.Println(c.n)18	fmt.Println(c)19	fmt.Println(&c)20}
⌘ Enter — проверить