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

时间:2011-03-20 10:43:05

标签: 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 )
}

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

2 个答案:

答案 0 :(得分:17)

这是我的分析。

(**myint)(&k) - 无法将&ktype **int)转换为type **myint

type **inttype **myint是未命名的指针类型,它们的指针基类型type *inttype *myint没有相同的基础类型。

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

(*myint)(k) - 可以将ktype *int)转换为type *myint

type *inttype *myint是未命名的指针类型,它们的指针基类型type inttype myinttype myint int)具有相同的基础类型。

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

(myint)(*k) - 可以将*ktype int)转换为type myint

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

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

这是“类型”部分中的基础类型示例,它修订为使用整数和int指针。

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

intT1T2的基础类型为int*T1T3T4的基础类型为*T1

参考文献:

The Go Programming Language Specification

Conversions

Types

Properties of types and values

Type declarations

Predeclared identifiers

Pointer Type

答案 1 :(得分: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)
}

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