在 Go 中设置引用

2024-04-24

如何通过引用传递接口并让方法为我填充它?像这样的东西:

var i CustomInterface
Get("title" , ref i)
i.SomeOperationWithoutTypeAssertion() //i is nil here(my problem)

func Get(title string, iRef ref interface{}){
     iRef = new(ATypeWhichImplementsTheUnderlyingInterface)
}

I want i调用后不为零Get方法。如何通过i作为参考Get method?


Go 没有 C++ 等语言中的透明引用参数的概念,所以你所要求的是不可能的:Get函数接收接口变量的副本,因此不会更新调用范围中的变量。

如果您确实希望函数能够更新作为参数传递的内容,那么它必须作为指针传递(即称为Get("title", &i))。没有语法指定参数应该是指向任意类型的指针,但所有指针都可以存储在interface{}这样该类型就可以用于参数。然后您可以使用类型断言 https://golang.org/ref/spec#Type_assertions / switch https://golang.org/ref/spec#Type_switches or the reflect package http://golang.org/pkg/reflect/以确定您被赋予的类型。您需要依靠运行时错误或恐慌来捕获参数的错误类型。

例如:

func Get(title string, out interface{}) {
    ...
    switch p := out.(type) {
    case *int:
        *p = 42
    case *string:
        *p = "Hello world"
    ...
    default:
        panic("Unexpected type")
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Go 中设置引用 的相关文章

  • golang:无法从内存不足崩溃中恢复

    在某些情况下 调用append 会触发内存不足恐慌 并且append 本身似乎不会返回nil 我怎样才能避免这种恐慌情况并向我的用户显示 资源暂时不可用 此致 你不能 如果运行时无法为追加分配内存 则可能无法恢复或向用户传达 资源暂时不可用
  • Go TCP 读取是非阻塞的

    我正在尝试用 Go 创建服务器和客户端 我已经成功地与服务器和客户端进行通信 但我遇到的问题是golang中的TCP读取是非阻塞的 我想知道 golang 中的读取是否有可能像 C 中的读取一样阻塞 谢谢 EDIT 这是服务器的源代码 fu
  • 如何模拟 gin.Context?

    嗨 我一直在尝试模拟杜松子酒 Context 但我无法使其工作 我正在尝试他们在这方面所做的solution https stackoverflow com questions 41742988 make mock gin context
  • 如何在 Go 中解组可以是数组或字符串的字段?

    我正在尝试解组该文件 babel email protected cdn cgi l email protection licenses MIT repository https github com babel babel tree ma
  • 为什么这里会出现僵局

    我想了解 golang 通道是如何工作的 我读了一本关于go语言的书 发现了下面的例子 package main import fmt Send the sequence 2 3 4 to returned channel func gen
  • 为什么我无法导入“内置”pkg?

    cat test go package main import builtin func main return go run test go can t find import builtin 我只是好奇 因为该文件存在并且已正确打包 但
  • 将 Base64 字符串转换为 JPG

    我正在得到图像为 base64 字符串 dataurl 下面是我的函数 它将dataurl进入图像 现在 如果图像是 png 则 png 库将创建图像 而 jpg 库将引发错误 反之亦然 问题是当我上传 png 时效果很好 但是当我上传 j
  • 为什么 Go 中无法将 [Size]byte 转换为字符串?

    我有一个大小字节数组 是我做完之后得到的md5 Sum data byte testing var pass string var b 16 byte b md5 Sum data pass string b 错误 cannot conve
  • 是否可以从 JS 显式调用导出的 Go WebAssembly 函数?

    是否可以调用 Go WebAssembly 函数 除了main 在 JavaScript 中 让我先展示一下我做了什么 我的Go函数定义如下 package main import fmt func main fmt Println it
  • Golang中的匿名接口实现

    在Go中 有没有办法匿名满足接口 似乎没有 但这是我最好的尝试 In the 操场 http play golang org p 4i 8o087dg package main import fmt type Thing interface
  • 处理变量的范围:内部循环

    作为一名直接进入 Go 的 JS 开发者 如果长度超过commits不止一个 我没有太多时间来完成这件事 而且我搜索的时间比我希望的要长 关于如何重组它或让它发挥作用有什么想法吗 case github PushPayload push p
  • 如何用 Go 将多个字符串解析为模板?

    有没有像这样的简单方法template ParseFiles base html home html 但是对于字符串来说 如何从一组字符串构建模板 我有一个基本模板和一个页面模板列表 全部为字符串 我想在基本模板之上构建它们 我想出了如何合
  • 为什么 golang 堆配置文件中的“Total MB”小于顶部的“RES”?

    我有一个用 go 编写的服务 在运行时需要 6 7G 内存 RES 在顶部 所以我使用 pprof 工具试图找出问题所在 go tool pprof pdf http
  • 使用私有 git 存储库时的 go 工作区结构

    当你不使用 github 时 我一直在尝试找出 go 代码 工作区的标准文件夹布局 结构 我可以看到如何go get在获取 github 项目时有效 但假设我自己的 git 项目不会有 github com username project
  • 在 Go 中将 float 转换为 int 时如何舍入到最近的 int

    将 float 转换为 int 时 小数点将被丢弃 有什么干净的方法可以将其四舍五入到最接近的整数 x int 3 6 应等于 4 而不是 3 int f 0 5 如果 gt 5 将导致向上舍入
  • go:找到模块但不包含包

    我正在尝试安装 go 的网络包 但收到 不包含包错误 终端截图 我咨询过 go 模块 latest 已找到但不包含包 https stackoverflow com questions 62974985 go module latest f
  • 地图中的最大元素数

    GO 中的 Map 最多可以存储多少个元素 如果我需要经常从 Map 访问数据 那么在长时间运行的程序中不断向 Map 添加项目并从中检索项目是一个好主意吗 除了map length类型的最大值之外 map中的元素数量没有理论上的限制 in
  • 为什么我不能执行 fmt.Sprintf("%d.%d.%d.%d", a...)?

    我正在学习 Go 但我一直坚持 Go 之旅 exercise stringer go https tour golang org methods 7 https tour golang org methods 7 这是一些代码 type I
  • 通过 API Gateway 使用表单数据将图像发布到 Lambda 函数会导致文件无效

    I ve a 用 Go 编写的 Lambda 函数 https github com mhausenblas imgn blob master functions app uploadimg main go应该允许图像文件上传 通过 HTM
  • Golang delve,如何启动调试器并启动正在调试的应用程序?

    我正在尝试设置一个可以远程连接的无头深度调试器 我无法找到一种方法来启动调试服务器 而该服务器不会暂停我正在调试的应用程序 我一直在使用dlv attach headless true listen 2345 attach 32但这会暂停该

随机推荐