Um procedimento é identificado como próximo ou distante com base na localização da função que está sendo chamada. Se a função for definida no mesmo pacote Go que o código que a está chamando, a função será considerada próxima. Se a função for definida em um pacote Go diferente, a função será considerada distante.
A diferença entre funções próximas e distantes só é significativa ao usar a instrução defer para lidar com pânicos ou fechar recursos no final de uma função. Quando uma instrução defer é encontrada, o tempo de execução Go colocará uma variável em uma pilha que armazena a função responsável por lidar com o adiamento. Se a função adiada estiver próxima, a variável armazenará um ponteiro para a função no mesmo pacote Go. Se a função adiada for distante, a variável armazenará um ponteiro para uma função stub que chamará a função distante por meio de uma chamada entre pacotes.
As chamadas entre pacotes são mais caras do que as chamadas dentro do pacote, portanto, geralmente é preferível usar funções próximas quando possível. Isso pode ser feito organizando seu código em pacotes de forma que as funções que você precisa usar juntas sejam definidas no mesmo pacote.