doulaozhi6835 2016-04-06 09:17
浏览 55
已采纳

执行:通过interface {}指针传递返回值

I have a function that looks like this:

func Foo(result interface{}) error {
     ...
     json.Unmarshal([]byte(some_string), result)
     ...
}

Which is called like this:

var bar Bar
Foo(&bar)

Generally, Foo fetches a string that is then unmarshalled into the result. However, now I need to update it so that Foo sometimes loads data from another source and returns that instead.

type Loader func() (interface{})

func Foo(result interface{}, Loader load) error {
     ...
     data := load()
     // result = data ???
     ...
}

Is there any way for me to assign this new value to result? I found that I can marshal the data into a string and then unmarshal it into result which works, but I can't imagine that's the best way.

  • 写回答

1条回答 默认 最新

  • douniao8687 2016-04-06 10:24
    关注

    You can do,

    p := result.(*Bar)
    *p = data
    

    The first line is a type assertion.

    The second assigns data to the dereferenced pointer. Assigning a value to a dereferenced pointer changes the value at the referenced address.

    Since you don't know the underlying types of result or data the best you can do is using a type assertion switch.

    switch v := data.(type) {
    case Bar:
        // If 'data' is of type 'Bar'
        p, ok := result.(*Bar)
        if(!ok){
            // This means inputs were bad.
            // 'result' and 'data' should both have the same underlying type.
            fmt.Println("underlying types mismatch")
            break;
        }
    
        *p = v
    
    case Baz:
        // If 'data' is of type 'Baz'
        // Equivalent of above for 'Baz'
    }
    

    See Type Switches from switch statement

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上