为了账号安全,请及时绑定邮箱和手机立即绑定

方法如何获取接口类型的输出参数?

方法如何获取接口类型的输出参数?

Go
慕勒3428872 2023-06-12 16:32:08
鉴于: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)}尝试一些配置后,我得到与“Expects *Savable, found *Customer”相关的编译错误,或者该GetSaved函数实际上并没有改变我想要成为“输出变量”的内容。这可行吗,我只是没有得到正确的接口/指针/等组合?或者由于某种原因这是不可能的?
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

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


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)

}

这是运行链接


查看完整回答
反对 回复 2023-06-12
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

这有效,我将它转换为字节并将其解组回您的结构。希望这可以帮助。:) 包主要


import (

    "encoding/json"

    "fmt"

)


type Savable interface{}

type Customer struct {

    Name string

} // satisfies 'Savable'


func GetSaved(id string, s Savable) {

    // somehow get a reference to the object from cache

    cached := Customer{Name: "Bob"}

    byt, _ := json.Marshal(cached)


    _ = json.Unmarshal(byt, &s)


}


func main() {

    c := Customer{}

    GetSaved("bob", &c)

    fmt.Println(c)

}

运行链接: https: //play.golang.org/p/NrBRcRmXRVZ


查看完整回答
反对 回复 2023-06-12
  • 2 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信