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 组策略中的计算机配置策略无法下发
  • ¥15 机器学习简单问题解决
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写