Как стать автором
Обновить

Комментарии 7

В С++ тоже можно вызвать метод от нулевого указателя на объект. Если в методе нет обращений к полям класса, и если метод невиртуальный — все сработает, по той же самой причине что и в Go.
А вот синтаксис, при котором для обращения к полям и методам всегда используется точка (и для объектов и для указателей) — крайне интересен. Я не могу сказать однозначно, хорошо это или плохо, но это тот вопрос который требует всестороннего изучения:)
В C++ это UB, и компилятор вправе исключить такой вызов. Хотя, признаться, сам баловался таким лет N-цать назад, когда про UB вообще ничего не знал. Сейчас прекратил.
Как компилятор может исключить вызов, если указатель формируется в рантайме и компилятору просто неизвестно его содержимое? Там может быть null, может быть валидный указатель или ненулевой и невалидный.
Ну например, здесь компилятор вправе считать что выражение в if всегда true и проверку выбросить.
    ptr = nullptr;
    // ...
    ptr->method();
    if (ptr) { printf("should not print!");}
Как-то немного сумбурно написано, особенно в месте «Когда используется передача по значению».
Строки это ж не совсем простой тип, это как struct (вернее это рид онли слайс, который ведет уже к struct).
Плюс хорошо бы указать, что все в го передается как значение. Т.е. даже указатель тоже передается как значение (т.е. копия адреса).
В общем, новичкам можно об эту статью споткнуться )

Один вопоос: где грань между большая и небольшая структура. Не помню сам вывел или где-то прочитал, но структуры всегда передаю по указателю, если тупо не забыл поставить звёздочку по пхп/джс привычке, что объекты передаются по ссылке.

Ещё одно из правил, как определять значение/указатель в приёмщике типа в методах (хотя скорее это расширение тезиса про сущность, которая в программе должна присутствовать в единственном экземпляре - как с User из статьи): если в поле структуры содержится тип-мьютекс (например, sync.Mutex), блокирующий структуру, то приёмщик всегда должен быть в форме указателя, иначе эта блокировка просто не будет работать.

методы Get() и Store() должны быть определены для указателя на Counters, а не на Counters (тоесть не func (c Counters) Load(key string) int { ... }, потому что в таком случае значение ресивера (c) копируется, вместе с чем скопируется и мьютекс в нашей структуре, что лишает всю затею смысла и приводит к проблемам.
Отсюда https://habr.com/ru/articles/338718/

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории