2011-03-20 144 views
12

任何人都可以告诉我为什么这不会编译?从一个指针到指针类型到另一个在Golang中的错误

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'也不是。这是当你有指针指针问题出现时。我一直坚持这第二天。任何帮助表示赞赏。

回答

15

这是我的分析。

(**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指针的Types部分中的基础类型示例。

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

基础类型的intT1,和T2int。底层类型*T1T3T4*T1

参考文献:

The Go Programming Language Specification

Conversions

Types

Properties of types and values

Type declarations

Predeclared identifiers

Pointer Type

+0

谢谢。第三条线是我正在寻找的答案。 – Gunchars 2011-03-21 05:23:23

+0

我想你也可以加上这个链接: http://golang.org/ref/spec#Type_identity 如果两个命名类型的名称来源于同一个TypeSpec,那么两个命名类型是相同的。所以myint!= int和* myint!= * int – 2013-02-17 17:20:45

+0

@DanielSperry关于指针的声明似乎是错误的,因为示例的答案显示了如何从'* int'转换为'* myint',反之亦然从'* myint'到'* int'。只需要在双引用中更加明确一些。 – ceving 2014-02-04 12:07:19

4

这里是你的程序的功能相当的工作版本。

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

相关问题