Пример с интерфейси и receiver–и
Благодаря :)
Много благодарим. Мисля, че наистина така може нещата да станат по-ясни на доста хора (възможността да си го пуснат наново ако нещо не е станало ясно също е полезна).
Ако трябва са бъда честен когато оригинално разбрах, че в
go
има указатели доста се учудих. Явно идеята е да бъде от ниско ниво, но все пак винаги съм разглеждал липсата на pointer-и вjava
като предимство, а не като недостатък.Като цяло винаги ми се е струвала много логична идеята просто примитивните типове да се подават по стойност, а всичко останало по референция.
Съответно в езици, в които това не е по default се опитвам ръчно да си емулирам същото поведение.
От тази гледна точка не е ли по-удобно ако просто навсякъде работим само с референции за структурите си, а ако някъде ни трябва копие просто да го копираме ръчно? (На мен така ми звучи логично).
В
perl
има парадигма TMTOWTDI (There's more than one way to do it), но като цяло засега показвахте това като недостатък (поне за грешките, както и форматирането). Наличието на един (очевиден) начин да се свърши нещо (python
) би трябвало да увеличи консистентността и съответно да намали потенциални грешки поради различни виждания.В случая с указателите имаме свобода и макар и това което казваш за това да си дефинираме немутиращите операции на базовия тип, а не на указателите да има смисъл - все пак имаме ли причина някога да придпочитаме използването на базов тип, ако така или иначе чрез указател към типа пак ще има всички негови методи и атрибути лесно достъпни?
И още един въпрос - когато имаме метод на
T
и го извикаме чрез*T
ще се направи ли копие само за извикването на метода? (ако да, то това би било аргумент да не искаме да го дефинираме наT
)@Илия, да, ще му направи копие. Това е oчакваното поведение, което получателя ти е
T
. Аз не казвам, че е нужно да си дефинирате всички немутиращи методи наT
, а че е по-удобно, когато имплементирате определени интерфейси.Stringer
е един такъв интерфейс. Въпреки това, ако имате голяма структура и не желаете да я копирате може да си имплементирате методи с получатели*T
тъй като най-вероятно така или иначе навсякъде ще работите с указатели.Това да се занимаваш да правиш
(&t).Method
, защото получателя ти е pointer не изглежда яко, но е възможен workaround.И да, когато не се правите копие нещата може да се забързат значително, но това зависи предимно от големината на типа.
Форматирането е съвсем друга бира. В повечето езици имаш разни
lint
-ове, които се опитват да ти се карат, тук просто не само ти се кара, а и ти оправя глупостите, за да се спазва някаква консистентност.
Трябва да сте влезли в системата, за да може да отговаряте на теми.