解释我的问题的最短方法是该代码:
var i interface{} // I can't change it. In fact this is a function,
i = Item{10} // that receives interface{}, that contain object (not pointer to object!)
fmt.Printf("%T %v\n", i, i)
// fmt.Println(i.(NextValuer).NextVal()) // won't compile
i = &i
fmt.Printf("%T %v\n", i, i) // there i is pointer to interface{} (not to Item)
// fmt.Println(i.(NextValuer).NextVal()) // panics
// fmt.Println(i.(*NextValuer).NextVal()) // won't compile
但是,如果我尝试将指向Item的指针设置为i,代码将起作用:
i = &Item{10}
fmt.Printf("%T %v\n", i, i)
fmt.Println(i.(NextValuer).NextVal())
但是我的函数接收对象,而不是指向它的指针。我可以得到它的类型(第一fmt.Printf
)。但是当我尝试指向它的指针时,我收到的是interface{}
,而不是我的Object(Item
)的指针。
我可以指向该对象进行调用NextVal
吗?或者可能是其他方式
切勿使用指向接口的指针。如果您需要一个指针来使用指针接收器调用方法,则必须将指针放入interface{}
。
如果在interface{}
要使用指针接收器调用方法的位置已经具有值,则需要制作该值的可寻址副本。
您想要完成i = &i
的工作可能是:
item := i.(Item)
i = &item
这将创建原始副本的可寻址副本Item
,然后将指向该副本的指针放入i
。请注意,这永远不会更改原始值Item
。
如果您不知道中的类型,则可以interface{}
使用“ reflect”复制值:
func nextVal(i interface{}) {
// get the value in i
v := reflect.ValueOf(i)
// create a pointer to a new value of the same type as i
n := reflect.New(v.Type())
// set the new value with the value of i
n.Elem().Set(v)
// Get the new pointer as an interface, and call NextVal
fmt.Println("NextVal:", n.Interface().(NextValuer).NextVal())
// this could also be assigned another interface{}
i = n.Interface()
nv, ok := i.(NextValuer)
fmt.Printf("i is a NextValuer: %t\nNextVal: %d\n", ok, nv.NextVal())
}
http://play.golang.org/p/gbO9QGz2Tq
查看如下程序:nexter是一个接口类型,并且定义了一个next()方法读取下一字节。函数nextFew将nexter接口作为参数并读取接下来的num个字节,并返回一个切片:这是正确做法。但是nextFew2使用一个指向nexter接口类型的指针作为参数传递给函数:当使用next()函数时,系统会给出一个编译错误:*n.next undefined (type nexter has no fiel
问题内容: 例如下面的示例: DO 和两个满足,即使一个是一个指针,另一个是直接一个结构? 问题答案: 通过编译代码很容易得到答案: 该错误是基于以下规格要求: 接收器类型必须采用T或 T的形式,其中T是类型名称。用T表示的类型称为接收方基本类型; 它不能是指针或接口类型* ,并且必须在与方法相同的包中声明。 (强调我的) 声明: 声明一个 指针 类型,即 没有资格作为方法接收者。
C++ 类 & 对象 一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符 ->,就像访问指向结构的指针一样。与所有的指针一样,您必须在使用指针之前,对指针进行初始化。 下面的实例有助于更好地理解指向类的指针的概念: #include <iostream> using namespace std; class Box { public:
所以我的教授喜欢用我们应该弄清楚的论文上的代码来测试我们。我不会发布代码,因为我不是在寻找答案,这只是他曾经让我们感到困惑的一件事是,当他初始化一个类的对象,然后初始化另一个类的指针指向上述对象时。它让我感到困惑,这是一个如此具体的问题,我不知道如何搜索它。例: “d- 当指针来自一个类却指向另一个类的对象时,它到底在做什么?我知道这个问题以前可能已经被回答过了,但是我在任何地方都找不到它,所以我
在下面给出的代码中,我声明了一个指向int的指针,我们都知道memcpy返回一个指向目标字符串的空指针,所以如果ptr是指向int的指针,那么为什么printf(“%s”,ptr);是完全有效的,ptr毕竟不是指向char的指针。
Go语言程序中对指针获取反射对象时,可以通过 reflect.Elem() 方法获取这个指针指向的元素类型。这个获取过程被称为取元素,等效于对指针类型变量做了一个 操作,代码如下: 代码输出如下: name: '' kind: 'ptr' element name: 'cat', element kind: 'struct' 代码说明如下: 第 15 行,创建了cat结构体的实例,ins 是一个