如何取消引用作为空接口传递的指针值?

2024-04-14

我有一个方法target interface{}在我用于数据库访问的类型上,例如:

func (c *client) Query(query someType, target interface{}) error {
    return c.db.Query(query).Decode(target)
}

然后这被称为

result := resultType{}
if err := c.Query(myQuery, &result); err == nil {
    // do sth with result
}

当我传递指针地址时,它会执行我想要的操作result

我现在遇到的麻烦是我不知道如何在测试中模拟这种行为(改变传递的引用)。

如果我不需要通过interface{}我可以想象它是这样完成的:

type mockClient struct {
    targetValue resultType
}

func (m *mockClient) Query(query someType, target *resultType) error {
    *target = m.targetValue
    return nil
}

如果我尝试使用我的实际签名执行相同的操作,我将无法取消引用中包含的值target像这样:

type mockClient struct {
    targetValue interface{}
}

func (m *mockClient) Query(query someType, target interface{}) error {
    target = m.targetValue // this does not mutate the passed target
    return nil
} 

当指针值作为空接口传入时,我可以取消引用它吗?如果不可能,测试我的方法的副作用而不必诉诸具体类型作为参数的另一种方法是什么?


您可以使用“reflect”包来做到这一点。

package main

import (
    "fmt"
    "reflect"
)

type mockClient struct {}

func (m *mockClient) Query(query string, target interface{}) error {
    a := "changed"
    va := reflect.ValueOf(a)
    reflect.ValueOf(target).Elem().Set(va)
    return nil
}

func main() {
    var mc mockClient
    target := "initial"
    mc.Query("qwe", &target)
    fmt.Println(target)
}

您可以找到参考的简单示例here https://play.golang.org/p/S7XllJpxLw1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何取消引用作为空接口传递的指针值? 的相关文章

  • 将产生 goroutine 的 golang 方法

    据我所知 如果 goroutine 太忙 它们会阻止其他 goroutine 运行 对我来说 这意味着我的应用程序的性能和响应能力可能取决于我知道哪些库方法将控制其他 goroutine 例如通常是 Read 和 Write 有什么方法可以
  • C 指针与 Objective-C 指针

    我有 Objective C 背景 正在尝试扩展我在 C 方面的知识 然而 有一件事让我感到困惑 那就是 C 和 Obj C 中指针之间的区别 正如您在下面的示例中看到的 两种语言之间的行为似乎有点不同 我想知道您是否可以帮助解释原因 C
  • “http:多个response.WriteHeader调用”有什么不好的影响?

    尽管我发现 http 多个响应 WriteHeader 调用 例外 但我的服务器表现良好 此异常不会导致我的服务器出现恐慌或行为异常 我进行了很多搜索 但只找到了如何解决这个问题 没有文档描述异常的不良影响 有人可以帮我找出为什么 http
  • 在 C++ 中检查空指针的首选方法是什么?

    选项A if NULL pSomethingColumn Yes we use Yoda conditions if NULL pSomethingColumn Or if pSomethingColumn if pSomethingCol
  • go json marshal 的默认大小写选项?

    我有以下结构要导出为 json type ExportedIncident struct Title string json title Host string json host Status string json status Dat
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • Golang const unsafe.Sizeof

    不明白为什么我可以做到 const OK uint64 0 const OK int unsafe Sizeof uint64 0 但不是这个 const NOK binary Size uint64 0 它的解释在规格 https gol
  • 如何将长 Go 模板函数拆分为多行?

    我有一个很长的printf调用 Go 模板 例子 printf mongodb s s s s authSource admin replicaSet s readPreference nearest w majority Values r
  • 将数组复制到动态分配的内存

    我的代码可以正常工作 但我觉得好像有一种更快的方法可以做到这一点 特别是在我的函数副本中 这是我的代码 这能再快一点吗 顺便说一句 这是 C 语言 另外 当我从函数返回 cpy 时 它是否会删除动态内存 因为它超出了范围 我不想发生内存泄漏
  • 函数指针声明语法混乱[重复]

    这个问题在这里已经有答案了 我已经阅读并搜索了有关解码函数指针的右左规则 For ex int fun one char double 9 20 is fun one 是指向函数的指针 需要 char double 和 返回指向 int 数
  • 是否可以通过引用以基类作为参数的函数来传递派生类

    假设我们有一个抽象基类IBase使用纯虚方法 接口 然后我们推导出CFoo CFoo2来自基类 我们有一个知道如何使用 IBase 的函数 Foo IBase input 这些情况下通常的场景是这样的 IBase ptr static ca
  • 是否可以获取指向装箱非托管值类型的指针?

    是否可以获取指向装箱非托管值类型的指针 而无需编写对每个支持的类型进行强制转换的大型 switch 语句 就像是 object val Contains a boxed unmanaged value such as int long by
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • 接口的隐式和显式实现

    在进行升级时 我碰巧遇到了这样的代码 interface ICustomization IMMColumnsDefinition GetColumnsDefinition class Customization ICustomization
  • 点击界面没有出现

    我决定添加一个点击界面并在我的代码中使用它 但我能够得到它的状态 sudo ip f link tuntap add tap10 mode tap sudo ip link set tap10 up 之后当我执行 ip link 时 tap
  • 管理多租户 ArangoDB 连接

    我使用 ArangoDB Go 使用 go driver 并且需要实现多租户 这意味着每个客户都将在单独的数据库中拥有他的数据 我想要弄清楚的是如何使这种多租户发挥作用 我知道为每个请求创建一个新的数据库连接是不可持续的 这意味着我必须维护
  • C# 如何在运行时动态生成实现不同接口的对象?

    我正在研究如何解决问题 但我什至不确定这在 C 和 NET 3 5 中是否可行 假设我的接口数量有限 每个接口都描述一组特定的 不相关的方法 现在我有许多现实世界的设备 每个设备都可以仅实现这些接口的一个子集 在与这些设备建立通信期间 他们
  • 重新设计循环依赖缺陷

    我有一堆小服务 它们共享一些常见的包 例如Logger Configuration and Net 我在单独的项目中编写了每个包 问题是我的Logger需求包Configuration用于设置 和我的Configuration not仅由L
  • []interface{}{} 中的双大括号是什么意思

    请注意 这是格式为 的双花括号 而不是嵌套花括号 我也不确定这是空接口问题 切片问题还是结构问题 我猜它至少是其中两个的组合 我正在学习 Golang 并且已经达到了空接口 我发现我需要将空接口声明为 interface 或者例如 inte

随机推荐

  • PHP date() 外语 - 例如3 月 25 日 Aoû 09 [重复]

    这个问题在这里已经有答案了 我有一个脚本需要向国际观众显示日期数据 例如 于 2009 年 8 月 25 日星期二提交 有没有一种更简单 更干净的方法可以将其转换为法语 等 等效项 Mar 25 Ao 09 而不是 设置常数LANG and
  • 如何将 Jersey ExceptionMapper 与 Google Guice 结合使用?

    我正在使用 Jersey Guice 并且需要配置自定义ExceptionMapper 我的模块如下所示 public final class MyJerseyModule extends JerseyServletModule Overr
  • 在 R 的另一个函数中使用 data.table

    使用列创建新变量时 data table 不允许带引号的列名称 当在函数中使用 data table 时 这会产生以下问题 library data table dt lt data table var1 c 1 10 var2 seq 2
  • TypeORM 为什么我的关系列未定义?外键未定义

    我只是使用 TypeORM 并发现关系列未定义 Entity name person export class Person PrimaryGeneratedColumn uuid id string OneToOne gt User Jo
  • 深层嵌套类型的Elasticsearch聚合

    之前我问过this https stackoverflow com questions 31841542 elasticsearch metric aggregation number of elements in array 318464
  • 等待循环结束

    有没有办法在运行下一个函数之前确保 for 循环已完成 我有一个场景 向用户显示一个用户列表 他们可以选择 X 个用户 一旦他们为所选的每个用户按下 完成 我就会调用 REST API 服务来获取有关的更多信息要添加到 用户 数组中的选定用
  • 枚举是引用类型还是值类型?

    我在我的中使用了 Enum 属性实体框架 http msdn microsoft com en US data ef5级 但在数据库中该字段可以为空 Visual Studio 给出错误 指出该属性必须是可为 null 的属性 我的问题是
  • 为什么我们需要指定标准的 Lark 词法分析器才能捕获评论终端?

    我正在开发一个基于 Lark 的项目 我需要能够 捕获 正在解析的代码中的注释 但是 当使用标准词法分析器而不明确指定标准词法分析器时 它不起作用 我采取了第二个例子云雀食谱 https lark parser readthedocs io
  • ar-sa 文化的预期日期时间字符串是什么?

    我有一个方法 DateToString DateTime datetime string format CultureInfo cultrueInfo return datetime ToString format cultureInfo
  • 更改旋转箭头,Appcompat v21

    i have activities which i themed with my custom theme but for spinner i choosed to style it with Appcompat v21 but i got
  • 是否有适用于 Microsoft Edge 浏览器的 Selenium WebDriver?

    截至本文发布之日 Microsoft Edge 这个名称刚刚被正式宣布为新 Windows 10 的默认浏览器 现在问这个问题可能还为时过早 但我想知道是否有新的 Selenium WebDriver 可用 如果没有 是否有任何说明我们可能
  • 计算分数的Java程序

    该程序的目的是获取一个分数的两个用户输入 从用户接收一个运算符 然后获取第二个分数的另外两个用户输入 该程序必须检查两个分数中使用的数字是否在 0 99 之间 并且分母非零 该程序还必须确保用户输入有效的运算符 我现在面临的唯一问题是我的变
  • 是否有可以在 form_div_layout.html.twig 中使用的变量的完整列表?

    我想获取Symfony表单主题文件form div layout html twig中可用的所有变量 我阅读了Symfony官方文档并在网上搜索 但找不到任何有用的信息 有人可以帮助我吗 那么 您可以通过迭代上下文来获取每个块中的所有可用变
  • 相同视图和浏览器版本中不同的 IE XML/XSL 行为,但使用不同的域用户帐户

    我们的一位用户在尝试访问我们的 Web 应用程序视图之一时遇到问题 IE9 行为在 6 8 和 9 中显得一致 但在域帐户之间不一致 对于该特定用户的 Windows 域帐户 无论使用哪些凭据来访问我们的应用程序 或者使用哪台机器的浏览器
  • 在 init 上创建 django 表单

    如何在表单初始化函数中添加字段 例如在下面的代码中我想添加一个配置文件字段 class StaffForm forms ModelForm def init self user args kwargs if user pk 1 self f
  • DocumentDb IN 子句中的最大项目数

    我在文档中找不到任何地方提及 DocumentDb 中 IN 关键字支持的最大项目数 我会假设有一个限制 任何人都可以在引用的文档中指出吗 DocumentDB 实际上消除了所有限制 将其提高到我们预计用户无法超越的水平 因此不再记录它们
  • 将 Team Foundation Server (TFS) 与 Xcode 连接

    我是 Xcode 和 TFS 的新手 有人可以解释一下如何将 TFS 2013 与 Xcode 连接来维护存储库 或者给我一个从一开始就包含完整详细信息的链接吗 这个想法是使用 Git 作为版本控制 并将更改推送到 TFS 中托管的中央存储
  • 将 pandas 中的句子拆分为句子编号和单词

    我有一个像这样的熊猫数据框 Text start end entity value I love apple 7 11 fruit apple I ate potato 6 11 vegetable potato 我尝试过使用 for 循环
  • 如何在 C# 中将 DataRowView 转换为 DataRow

    我想使用拖放 但我不知道如何将信息从 DataGridView 控件拖动到 DataGridView 或 ListBox 我有一个链接http www codeproject com KB cpp DataGridView Drag n D
  • 如何取消引用作为空接口传递的指针值?

    我有一个方法target interface 在我用于数据库访问的类型上 例如 func c client Query query someType target interface error return c db Query quer