Использование указателя - это не «запах кода», это внутренняя особенность Go, которую вы должны научиться правильно использовать.

Ваш надуманный пример выполняет глубокую копию структуры, которая содержит два указателя и один int (строки передаются внутри как указатели), поэтому либо копирование всей структуры, либо вызов указателя является фоновым шумом по сравнению с другими вещами, которые компьютер делает во время на каждой итерации, особенно при вызове Sprintf.

Я написал для вас надуманный пример.

Https://repl.it/@CampNowhere/ExpertEmptyGroupware

Что я делаю, так это создаю структуру, которая обертывает массив из 100000 целых чисел, и я выполняю над ней операцию - суммирую первые 100. Я написал две версии метода: одну, которая использует глубокую копию, и одну, которая использует указатель. Метод указателя в 2500–3000 раз быстрее. Похоже, ваша статья подразумевает, что Go выполняет какую-то скрытую оптимизацию, чтобы вызвать вызов по значению и вызов по указателю, синонимами, но это абсолютно, на 100% неверно.

Вызов по значению создает глубокую копию структуры. В нашем случае это 100000 целых чисел, которые необходимо выделить в куче и сохранить в памяти, что занимает значительное время по сравнению с передачей указателя, который просто передает указатель и считывает целые числа из того же места в памяти.