有谁可以告诉我为什么不能编译?
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'也不是。当你有指向指针问题的指针出现时。我现在第二天一直坚持这个。任何帮助表示赞赏。
答案 0 :(得分:17)
这是我的分析。
(**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
。
参考文献:
The Go Programming Language Specification
答案 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)
}