никаких, насколько мне известно
Единственное, что еще я не понял в этом вопросе. Почему функции хеширования в стд либе возвращают интерфейсы
Ну разве что закопать реализацию в своей либе...
Можно строить рефлектом!
что-то не пойму, что имеешь в виду. Можешь пояснить?
этого делать в большинстве случаев не стоит
Это для извращенцев
я вот про эту например: h := md5.New()
Оно да, не по канонам. А с другой стороны - ну верну я поинтер на структуру, из которой в паблик только методы торчат. Чем это технически от интерфейса отличается?
отсутствием полиморфизма?
ничем именно поэтому надо вернуть структуру (теперь, по наущению @naphaso , я еще приватную структуру повадился возвращать. пока полет нормальный)
Кстати приватная структура, да. Хотя какие-то линтеры на такое ругались.
тем что нажав Ctrl+LMB на метод, я попаду в объявление, а не в имплементацию
Туплю под вечер. Можно пояснить?
А как ты фабрику-то делаешь?
Тем, что у интерфейса может быть несколько имплементаций
а вот фабрика возвращает интерфейс, да, там иначе ника
Ctrl+F12 (find implementation), ага
возвращать приватную структуру?! зачем 🤯 это же значит что я не смогу объявить zero value: var x yourlib.Type x = yourlib.New() насколько я помню этого даже линтеры не любят
виртуальной таблицы нет, когда просто поинтер на структуру, в отличие от интерфейса
А, если в такую глубину копать... )))
я понимаю что имплементацию можно найти. Но от конструктора я всегда ожидаю одно и то же. Один тип.
и очень хорошо, что не можешь! пойдешь New() вызовешь! (конечно же, я так делаю только для тех структур, что имеют New(), и не имеют публичных полей)
а если я хочу объявить в структуре поле с инстанцией объекта который возвращает yourlib.New?
тип поля - интерфейс
речь про возвращение unexported типа
тебе от такой структуры ничего, кроме поведения, не должно быть нужно, очевидно объявляй интерфейс, и все получится
ну Стас сказал, что так надо делать, я решил поэкспериментировать. вроде, проблем не замечено пока
Обсуждают сегодня