任何人都可以告诉我为什么这不会编译?
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 int并type 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,T1和T2是int.基础类型的*T1,T3和T4是*T1.
参考文献:
这是您的程序的两个功能相同的工作版本.
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