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

鉴于:


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


慕勒3428872
浏览 166回答 2
2回答

泛舟湖上清波郎朗

您可以使用反射来设置传递的接口。即使将结构引用作为接口传递,底层类型信息也不会丢失,我们可以使用反射。package mainimport (    "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)}这是运行链接

繁花不似锦

这有效,我将它转换为字节并将其解组回您的结构。希望这可以帮助。:) 包主要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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go