go - 方法如何获取接口类型的输出参数?
问题描述
鉴于:
type Savable interface {}
type Customer struct {} // satisfies 'Savable'
func GetSaved(id string, s Savable) {
// somehow get a reference to the object from cache
s = cachedObject
// alternately, something like:
// json.Unmarshal(jsonFromDisk, &s)
}
func Foo() {
c := Customer{}
GetSaved("bob", &c)
}
尝试了一些配置,我要么得到与“期望 *Savable,找到 *Customer”相关的编译错误,要么该GetSaved
函数实际上并没有改变我想要成为“输出变量”的内容。这是可行的,我只是没有得到正确的接口/指针/等组合吗?或者由于某种原因这是不可能的?
编辑:说明问题的工作示例。
解决方案
您可以使用反射来设置传递的接口。即使将结构引用作为接口传递,底层类型信息也不会丢失,我们可以使用反射。
package main
import (
"fmt"
"reflect"
)
type Savable interface {}
type Customer struct {
Name string
}
func GetSaved(id string, s Savable) {
cached := Customer{ Name: id }
c1 := reflect.ValueOf(cached)
reflect.ValueOf(s).Elem().Set(c1)
}
func main() {
c := Customer{}
fmt.Printf("Before: %v\n", c)
GetSaved("bob", &c)
fmt.Printf("After: %v\n", c)
}
这是运行链接
推荐阅读
- django - Django编写中间件来扩展self.request
- ios - SwiftUI 关闭多个模式表
- java - 当我运行我的程序 Java.lang.ClassNotFoundException:con.mysql.jdbc.driver 错误来了
- c++ - 使用循环的字典字符串比较
- microsoft-graph-api - 为 .csv 和 .xls 文件生成的预览链接出错
- jmeter - 获取错误响应代码:无响应响应消息:读取超时,未收到响应
- r - 从同一行的 3 列中获取多数并将结果添加为新行
- javascript - 如何从函数返回值以使用它并在 Nodejs 的路由器中响应它?
- delphi - 将文本文件中的字符串读入 Pascal 中的数组
- node.js - Node Express && HTTP Desync Attacks, 请求走私