myinterface(a1)
является типом преобразования , оно преобразует a1
в тип myinteface
.
Выражения преобразования типа не адресуемы, поэтому вы не можете получить его адрес.То, что адресуется, явно указано в Spec: Операторы адреса:
Операнд должен быть адресуемый , то есть либо переменная, косвенное указатель,или операция индексации среза;или селектор поля адресуемого структурного операнда;или операция индексации массива адресуемого массива.В качестве исключения из требования адресуемости, x
[в выражении &x
] также может быть (возможно в скобках) составной литерал .
Этот связанный список ответовНесколько вариантов получения адреса таких выражений: Как сделать литерал * int64 в Go?
Например, если вы используете составной литерал для создания среза типа []myinterface
и вставив в него a1
, вы можете взять адрес его первого элемента (который будет иметь тип *myinterface
):
b1 := b{&[]myinterface{a1}[0]}
И он будет работать (попробуйте на Go Playground ):
a1 := a{3}
b1 := b{&[]myinterface{a1}[0]}
fmt.Println(b1)
Но знайте, что использование указателей на интерфейсы очень редко необходимо, так что поле типа *myinterface
действительно то, что вы хотите в первую очередь?
Значения интерфейса могут быть nil
, а также значения nil
(например, nil
указатели) также могут быть заключены в интерфейсы, поэтому, скорее всего, вам не нужен указатель на интерфейс.Нам нужно знать вашу «более широкую» цель, чтобы сказать, действительно ли это то, что вам действительно нужно.