试图取消引用一个接口,该接口是一个指向后端结构对象的指针,以便我可以按值传递给函数

Posted

技术标签:

【中文标题】试图取消引用一个接口,该接口是一个指向后端结构对象的指针,以便我可以按值传递给函数【英文标题】:Trying to dereference an interface that is a pointer to a struct object on the back end so I can pass by value to a function 【发布时间】:2018-01-31 04:27:16 【问题描述】:

我有一个接口,它在初始化后表示指向结构对象的指针。我想访问接口引用的对象的值而不是指针,以便我可以将值作为接口类型传递给函数。

这是我的问题的一个例子:https://play.golang.org/p/_3vKThlj-V

我希望能够在我的主函数中将 val 按值传递给函数 EvalTest,这样我就可以在另一个线程中覆盖指向 TestStruct 对象的指针,而不会在另一个线程中导致指针取消引用问题。

问题是我正在针对我的接口对象运行数千个 go 例程,但是由于我正在集成的系统的限制,每 50 个 go 例程调用我都必须重新初始化我的指针。这似乎导致了一种不一致的状态,即当 go 例程尝试再次访问它时,新的结构初始化没有完全完成。所以我想通过值传递它的原因是我不必担心指针被换出。

对此有什么想法吗?

【问题讨论】:

也许提供不起作用的示例,以便我们可以看到您想要做什么以及为什么。可能有更简单的方法。 Go 没有线程,只有 goroutines(在你的例子中没有),你不应该覆盖指针。你看到的问题是什么?告诉我们问题,而不是您提出的解决方案。 这样更好,但最好的例子是展示问题。当您说按值传递时,您大概是指复制实例?如果是这样,为什么不为每个请求/goroutine 创建一个新实例? 您在操场上的示例没有显示任何需要摆脱指针类型的内容。能举个真实的例子吗? 我在此线程上的最新帖子中包含了一个类似于我为解决方案所做的示例。 【参考方案1】:

这是通过为我的集成 api 连接使用通道并在成功初始化时将新指针向下传递到通道来解决的。我还可以使用其他一些优化来确保仅在连接成功时替换指针。这是我在 Go slack 频道中从 Paul K 那里得到的一个示例。

https://play.golang.org/p/AmbsfQOzol

【讨论】:

以上是关于试图取消引用一个接口,该接口是一个指向后端结构对象的指针,以便我可以按值传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

[UE4]引用Grabbable接口

在 GDB 中取消引用双指针(指向值的指针)

父类引用指向子类对象

父类引用指向子类对象

java语言基础汇总

接口和多态