Приведение от одного указателя к типу указателя к другому при ошибке Голанга - PullRequest
12 голосов
/ 20 марта 2011

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

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 )
}

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

Ответы [ 2 ]

17 голосов
/ 21 марта 2011

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

(**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

Преобразования

Типы

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

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

Предварительно объявленные идентификаторы

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

7 голосов
/ 21 марта 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...