Хороший обзор рекомендаций в отношении структуры Go-проектов представила Кэт Зиен (Kat Zien) в своем докладе на конференции GopherCon 2018 (https://oreil.ly/0zHY4).
В среде выполнения языка Go интерфейсы реализуются как два указателя, один из которых указывает на используемый тип, а другой — на используемое значение.
Иногда в языке со статической типизацией требуется определенным образом сообщить о том, что переменная может содержать значение любого типа. В Go для этой цели предназначен пустой интерфейс interface{}
Однако при передаче указателя функция получает копию указателя, который по-прежнему указывает на исходные данные. Это означает, что в таком случае вызываемая функция может изменить оригинал.
Программируйте на уровне интерфейса, а не на уровне реализации». В таком случае вы будете зависеть только от поведения, а не от реализации, что позволит при необходимости заменить одну реализацию на другую