Разница в типах значений / типах указателей в golang

Я знаю, что этому ответили до смерти, но я хотел бы показать фактический пример различий в скорости.

Здесь мы создаем 2 000 000 новых объектов с помощью метода print в Chrome. Мы сохраняем каждый объект в массиве. Помещение print на прототип занимает около 1/2.

-1
задан Ken White 14 July 2018 в 02:02
поделиться

1 ответ

, когда я использую 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).

Поскольку интерфейс имеет оба метода, только его может выполнить только указатель.

2
ответ дан eugenioy 17 August 2018 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: