首页 > 解决方案 > 方法如何获取接口类型的输出参数?

问题描述

鉴于:

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函数实际上并没有改变我想要成为“输出变量”的内容。这是可行的,我只是没有得到正确的接口/指针/等组合吗?或者由于某种原因这是不可能的?

编辑:说明问题的工作示例

标签: go

解决方案


您可以使用反射来设置传递的接口。即使将结构引用作为接口传递,底层类型信息也不会丢失,我们可以使用反射。

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)
}

这是运行链接


推荐阅读