Definition...
Pointers are special kind of variables responsible for holding memory address of other variables.
They act just like another variable, they have a memory address of their own but what makes them special is that we can derefference their address value to reach the underlying memory value (emphasis on value, not the address).
As you can see in the above diagram, Number2 is a int pointer which points to the address of Number1 variable, but note that Number2 has an address of it's own as well.
Also, Int Pointer doesn't mean that pointer contains an int value, but rather the pointer points to a int value.

Confused Enough? Great!! Let's now makes things a bit more clear via code!
Working of a pointer in GO
Consider the following example
package main
import "fmt"
//Function to double the given number
func doubleIt (number int){
number = number * 2
return
}
func main(){
number := 2
//calling doubleIt function with above `number` as argument
doubleIt(number)
//This will print out "number is equals to 2"
fmt.Printf("number is equals to %d ", number)
return
}
Output:
number is equal to 2
In the above code, we created a function named doubleIt which takes a number int as an argument and doubles it, sweet!
Soo.... what's the catch?!!
Well... if only things were that simple, you see, when we give number to doubleIt as an argument, it makes a copy of it in the HEAP memory, it doesn't affect the number variable inside the main function.
But let's look at another example now
package main
import "fmt"
// Function to double the given number
func doubleIt(number *int) {
*number = *number * 2
return
}
func main() {
number := 2
//calling doubleIt function with above `number` as argument
doubleIt(&number)
//This will print out "number is equals to 4"
fmt.Printf("number is equals to %d ", number)
return
}
Output:
number is equal to 4
Note the changes made to line 6 , 7 and 14 .
On line 6 and 7 instead of passing the value directly, which in turn produces a copy of variable in the heap, what the doubleIt function accepts is an int pointer to which on line 7 we mutate via a technique called Dereferencing .
and finally on line 14 while calling the doubleIt function, we provide it the address of number via the & (address of) operator.
Pointer deferencing
Dereferencing is used to access or manipulate data contained in memory location pointed to by a pointer. *(asterisk) is used with pointer variable when dereferencing the pointer variable, it refers to variable being pointed, so this is called dereferencing of pointers.
Conclusion
Since GO is a garbage collected language, passing addresses to functions instead of values would result in much better performance because of much less copying of data in the heap, hence less work for garbage collector, but it could lead to much undefined behaviour since it would be hard to figure which function is mutating which value.