, когда я использую 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).Поскольку интерфейс имеет оба метода, только его может выполнить только указатель.
Вы должны создать миграцию, которая обрабатывает создание расширения для вас. Вот документы на него.
Вы должны сделать:
python manage.py makemigrations <APP_NAME> --empty
Затем в этой миграции импортировать:
from django.contrib.postgres.operations import CITextExtension
и добавить CITextExtension()
в список migrations
. Эта миграция должна зависеть от миграции, которая создала поле CITextField
.