Пример с интерфейси и receiver–и

  1. Много благодарим. Мисля, че наистина така може нещата да станат по-ясни на доста хора (възможността да си го пуснат наново ако нещо не е станало ясно също е полезна).

    Ако трябва са бъда честен когато оригинално разбрах, че в go има указатели доста се учудих. Явно идеята е да бъде от ниско ниво, но все пак винаги съм разглеждал липсата на pointer-и в java като предимство, а не като недостатък.

    Като цяло винаги ми се е струвала много логична идеята просто примитивните типове да се подават по стойност, а всичко останало по референция.

    Съответно в езици, в които това не е по default се опитвам ръчно да си емулирам същото поведение.

    От тази гледна точка не е ли по-удобно ако просто навсякъде работим само с референции за структурите си, а ако някъде ни трябва копие просто да го копираме ръчно? (На мен така ми звучи логично).

    В perl има парадигма TMTOWTDI (There's more than one way to do it), но като цяло засега показвахте това като недостатък (поне за грешките, както и форматирането). Наличието на един (очевиден) начин да се свърши нещо (python) би трябвало да увеличи консистентността и съответно да намали потенциални грешки поради различни виждания.

    В случая с указателите имаме свобода и макар и това което казваш за това да си дефинираме немутиращите операции на базовия тип, а не на указателите да има смисъл - все пак имаме ли причина някога да придпочитаме използването на базов тип, ако така или иначе чрез указател към типа пак ще има всички негови методи и атрибути лесно достъпни?

    И още един въпрос - когато имаме метод на T и го извикаме чрез *T ще се направи ли копие само за извикването на метода? (ако да, то това би било аргумент да не искаме да го дефинираме на T)

  2. @Илия, да, ще му направи копие. Това е oчакваното поведение, което получателя ти е T. Аз не казвам, че е нужно да си дефинирате всички немутиращи методи на T, а че е по-удобно, когато имплементирате определени интерфейси. Stringer е един такъв интерфейс. Въпреки това, ако имате голяма структура и не желаете да я копирате може да си имплементирате методи с получатели *T тъй като най-вероятно така или иначе навсякъде ще работите с указатели.

    Това да се занимаваш да правиш (&t).Method, защото получателя ти е pointer не изглежда яко, но е възможен workaround.

    И да, когато не се правите копие нещата може да се забързат значително, но това зависи предимно от големината на типа.

    Форматирането е съвсем друга бира. В повечето езици имаш разни lint-ове, които се опитват да ти се карат, тук просто не само ти се кара, а и ти оправя глупостите, за да се спазва някаква консистентност.

Трябва да сте влезли в системата, за да може да отговаряте на теми.