2011-03-20 59 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

相關問題