谁能告诉我为什么无法编译?
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’也不是。当您有指针问题出现时。我已经坚持了第二天。任何帮助表示赞赏。
这是我的分析。
(**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
)中引用的类型的基础类型。
这是来自Types部分的基础类型示例,将其修改为使用整数和int指针。
type T1 int
type T2 T1
type T3 *T1
type T4 T3
基础类型的int
,T1
和T2
是int
。基础类型的*T1
,T3
和T4
是*T1
。
参考文献:
Go编程语言规范
转换次数
种类
类型和值的属性
类型声明
预声明的标识符
指针类型
问题内容: 我目前正在学习使用Go语言编程。我在理解Go指针时遇到了一些困难(并且我的C / C ++现在很遥远…)。例如,在“第52号游览”中(http://tour.golang.org/#52),我读到: 但是如果不是 我写: 甚至: 反之亦然: 我得到了完全相同的结果。有区别吗(在内存方面,等等)? 问题答案: 您的示例使用两种Go语言规则: 可以从具有值接收器的方法派生具有指针接收器的方
公有派生类的对象可作为其相应基类的对象处理,这使得一些有意义的操作成为可能。例如,从某个特定基类派生出来的各种类,尽管这些类的对象彼此之间互不相同,但是仍然能够建立这些对象的链表,只要把这些对象作为基类对象处理就可以了。然而反过来是不行的,基类的对象不能自动成为派生类的对象。 常见编程错误 9.1 将基类对象作为派生类对象处理。 程序员可以用显式类型转换把基类指针强制转换为派生类指针。但是,如果要
我以为我知道指针,但当我研究运行时多态性/动态绑定时,我看到了指针的一种非常不同的用法。下面是我的3个问题,它们都是关于下面的单行代码的:
关于指针的转换,C草案标准(N3337)有以下内容: 4.10指针转换 2“指向cv的指针”类型的右值(其中T是对象类型)可以转换为“指向cv的指针无效”类型的右值将“指向cv的指针”转换为“指向cv的指针无效”的结果指向类型为T的对象所在的存储位置的起点,就好像该对象是类型为T的派生度最高的对象(1.8)(即,不是基类子对象)。 和 4.12布尔转换 1算术、枚举、指针或指向成员类型的指针的右值
问题内容: 我有以下功能: 其中,的类型是具有以下定义的接口: 题: 这是真的,和是 通过按引用 ,并且有它的价值被复制? 我认为: 是通过引用的,因为它是一张地图 是一个结构。因此,我应该传递指针以避免复制数据 问题答案: 接口类型只是一组方法。请注意,接口定义的成员未指定接收方类型是否为指针。这是因为 值类型的方法集是其关联的指针类型的方法集的子集 。满嘴 我的意思是,如果您具有以下条件: 然
指针变量数据类型的强制转换 必须显式强制类型转换,不允许隐式类型转换 指向空间的强制类型转换,本质上就是普通变量的强制类型转换 int a = 10; float b = 3.14; int *pa = &a; float *pb = &b; *pa = (int)*pb; // 等价于 a = (int)b; 指针本身强制类型转换,改变的是对其指向空间的引用方式(空间大小和存储结构) int