如果我有:
type foo struct{
}
func bar(baz interface{}) {
}
上面是固定的-我不能更改foo或bar。另外,baz必须在bar内转换回foo struct指针。如何将&foo {}强制转换为interface
{},以便在调用bar时可以将其用作参数?
要打开*foo
到一个interface{}
很简单:
f := &foo{}
bar(f) // every type implements interface{}. Nothing special required
为了返回到*foo
,您可以执行 类型断言 :
func bar(baz interface{}) {
f, ok := baz.(*foo)
if !ok {
// baz was not of type *foo. The assertion failed
}
// f is of type *foo
}
或 类型开关
(类似,但baz
可以是多种类型则很有用):
func bar(baz interface{}) {
switch f := baz.(type) {
case *foo: // f is of type *foo
default: // f is some other type
}
}
假设代码是用c11编译的,并且启用了严格别名。 我不是在寻找一种不同的方法,我想专注于这个具体的问题,以及它是否可行或为什么不可行。 (如果我无意中犯了一些无关的错误,请告诉我,我会改正的) C11标准说: 6.2.5.28所有指向结构类型的指针应具有彼此相同的表示和对齐要求。 6.7.2.1.6结构是由成员序列组成的类型,其存储按有序顺序分配 这意味着结构A和B中指针的大小和对齐方式相同。 结构
C标准规定: 指向结构对象的指针,经过适当的强制转换,指向其初始成员(如果该成员是位字段,则指向其所在的单元),反之亦然。 如果有问题的结构的第一个成员是匿名结构/联合,是否有任何可能(并且定义良好)的方法在C11中执行这种“合适的转换”?或者如果包含的结构是匿名的,则执行“反之亦然”的反向转换? 我猜想,转换为与匿名结构具有相同成员序列的非匿名结构会使它无法很好地定义,因为它们不兼容,因此不能保
问题内容: 我正在尝试将切片的结构分配给切片(以传递到AppEngine的切片。但是,由于这两种类型显然不兼容,这会导致编译错误: 基本上我有: 反正是有复制到不复制一个-AT-A-时间每个元素? 问题答案: 您将不得不一次复制一次。没有办法解决。 如果有助于接受这一点,则应考虑以下事实:将结构包装在接口中实际上确实将其包装在内存级别。接口包含指向原始类型的指针和类型本身的描述符。将单个结构投射到
问题内容: 的在系统调用 包在Golang返回类型,而底层系统调用实际上返回一个指针。它是如何做到的? 更具体地说,在Golang开发人员的此程序包中,该函数仅返回一个指针。如何将其转换为字节片,就像在Unix软件包中一样? 问题答案: 使用该包,您可以在未导出类型的Mmap方法中执行相同的操作: 这是一个操场的例子。
问题内容: 在以下代码段中,尝试将nil接口转换为某物的指针失败,并出现以下错误: 在此处播放链接:https : //play.golang.org/p/2cgyfUStCI 为什么这会完全失败?完全有可能做 ,所以我想知道如何从nil接口开始实现类似的效果。 问题答案: 这是因为 静态 类型的变量(只是一个接口)可能包含许多不同 动态 类型的值。 是的,因为工具,您的变量 可能 持有类型的值,
当使用来自外部库的函数时,“任意”取消引用指向const引用的指针是否安全? 这样做是否普遍安全/明智 更重要的是,除了C语言中“不赞成”的原始指针之外,使用常量指针真的有充分的理由这样做吗?