Кастинг с одного указателя на тип указателя на другой в Golang error

Может ли кто-нибудь сказать мне, почему это не будет компилироваться?

package main

type myint int
func set(a **myint) {
    i := myint(5)
    *a = &i 
}

func main() {
    var k *int
    set( (**myint)(&k) ) // cannot convert &k (type **int) to type **myint
    print( *k )
}

Мое рассуждение до сих пор таково. Все типы в Голанге разные, но он позволяет конвертировать из одного типа в другой с синтаксисом C-like cast, если базовые типы идентичны. В моем примере преобразование 'int' в 'myint' не является проблемой. '* int' to '* myint' тоже не является. Это когда у вас есть указатель на проблемы с указателем. Я застрял на этом уже второй день. Любая помощь приветствуется.

Ответ 1

Вот мой анализ.

(**myint)(&k) - не может преобразовать &k (type **int) в type **myint:

type **int и type **myint являются неназванными типами указателей и их базовыми типами указателей, type *int и type *myint, не имеют одинаковых базовых типов.

Если T (*int или *myint) является литералом типа указателя, соответствующий базовый тип - сам T.

(*myint)(k) - может преобразовать k (type *int) в type *myint:

type *int и type *myint являются неназванными типами указателей и их базовыми типами указателей, type int и type myint (type myint int), имеют одинаковые базовые типы.

Если T (int) является предопределенным типом, соответствующий базовый тип - сам T. Если T (myint) не является запрограммированным типом или литералом типа, базовый тип T является базовым типом типа, к которому T относится к объявлению своего типа (type myint int).

(myint)(*k) - может преобразовать *k (type int) в type myint:

type int и type myint имеют одинаковые базовые типы.

Если T (int) является предопределенным типом, соответствующий базовый тип - сам T. Если T (myint) не является запрограммированным типом или литералом типа, базовый тип T является базовым типом типа, к которому T относится к объявлению своего типа (type myint int).

Здесь пример базового типа из раздела "Типы" переработан для использования целых чисел и указателей int.

type T1 int
type T2 T1
type T3 *T1
type T4 T3

Основной тип int, T1 и T2 - int. Основной тип *T1, T3 и T4 - *T1.

Литература:

Спецификация языка программирования Go

Conversions

Types

Свойства типов и значений

Объявления типов

Предопределенные идентификаторы

Тип указателя

Ответ 2

Вот две функционально эквивалентные рабочие версии вашей программы.

package main

type mypint *int

func set(a *mypint) {
    i := int(5)
    *a = &i
}

func main() {
    var k *int
    set((*mypint)(&k))
    print(*k)
}

http://play.golang.org/p/l_b9LBElie

package main

type myint int

func set(a *myint) *myint {
    i := myint(5)
    a = &i
    return a
}

func main() {
    var k *int
    k = (*int)(set((*myint)(k)))
    print(*k)
}

http://play.golang.org/p/hyaPFUNlp8