在Golang错误中从一个指针转换为指针类型到另一个指针

Gun*_*ars 14 pointers go

任何人都可以告诉我为什么这不会编译?

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 )
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的理由是这样的.Golang中的所有类型都不同,但只要底层类型相同,它就允许使用类似C的强制转换语法从一种类型转换为另一种类型.在我的例子中,将'int'转换为'myint'不是问题.'*int'到'*myint'也不是.当你有指向指针问题的指针出现时.我现在第二天一直坚持这个.任何帮助表示赞赏.

pet*_*rSO 19

这是我的分析.

(**myint)(&k)- 无法转换&k(type **int)到type **myint:

type **int并且type **myint是未命名的指针类型及其指针基类型,type *int并且type *myint没有相同的基础类型.

如果T(*int*myint)是指针类型文字,则相应的基础类型是T本身.

(*myint)(k)- 可以convert 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)- 可以convert *k(type int)到type myint:

type inttype myint具有相同的基础类型.

如果T(int)是预先声明的类型,则相应的基础类型是T本身.如果T(myint)既不是预先声明的类型也不是类型文字,则T的基础类型是T在其类型声明(type myint int)中引用的类型的基础类型.

这是修改为使用整数和int指针的Types部分的基础类型示例.

type T1 int
type T2 T1
type T3 *T1
type T4 T3
Run Code Online (Sandbox Code Playgroud)

基础类型的int,T1T2int.基础类型的*T1,T3T4*T1.

参考文献:

Go编程语言规范

转换

类型

类型和值的属性

输入声明

预先声明的标识符

指针类型


pet*_*rSO 7

这是您的程序的两个功能相同的工作版本.

package main

type mypint *int

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

func main() {
    var k *int
    set((*mypint)(&k))
    print(*k)
}
Run Code Online (Sandbox Code Playgroud)

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)
}
Run Code Online (Sandbox Code Playgroud)

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