Я знаю, что этому ответили до смерти, но я хотел бы показать фактический пример различий в скорости.
Здесь мы создаем 2 000 000 новых объектов с помощью метода print
в Chrome. Мы сохраняем каждый объект в массиве. Помещение print
на прототип занимает около 1/2.
, когда я использую var tf intf = & amp; t1, Это правильно. Но когда я использую var tf intf = & amp; t1, это не
. Так как в вашем примере вы используете
tf intf = t1
(и он не компилируется), я думаю, вы, вероятно, имели в виду:, когда я использую var tf intf = & amp; t1, Правильно Но когда я использую var tf intf = t1, это не
Итак, вопрос в том, почему
&T{"t1"}
(указатель) выполняет интерфейсintf
, аT{"t1"}
(значение) этого не делает.В вашем примере интерфейс имеет два метода
M1
иM2
.Тип T реализует оба метода BUT:
- M1 имеет
T
значение в качестве приемника- M2 имеет
T
указатель в качестве приемникаИтак, почему компилятор рассматривает
T
, чтобы оба метода были реализованы, но считает, что значениеT
отсутствует?Ответ можно найти здесь в спецификации:
https: // golang.org/ref/spec#Method_sets
Набор методов любого ot ее тип T состоит из всех методов, объявленных с типом приемника T. Набор методов соответствующего типа указателя * T представляет собой набор всех методов, объявленных с помощью приемника * T или T (то есть он также содержит набор методов T).
Спектр говорит, что указатель
T
имеет все методы, определенные с приемникамиT
и*T
(поэтому в этом случае оба M1 и M2).Но значение
T
имеет только методы, определенные с помощью приемникаT
(поэтому в этом случае только M1).Поскольку интерфейс имеет оба метода, только его может выполнить только указатель.