求教, 如何将一个自定义结构体的对象传入给一个参数为interface{}的函数,并给其赋值?

oscarzhou · 2018-01-17 12:21:08 · 1823 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-01-17 12:21:08 的主题,其中的信息可能已经有所发展或是发生改变。

我之所以有这个想法是因为看到标准库里的 func Unmarshal(data []byte, v interface{}) error 是这样的,并且传入任意结构体实例的指针给v, 就能解出对应的值。

我的例子的playground : https://play.golang.org/p/-WQQvSNqcJv

为什么我这个例子不可以呢?我有试着去看 Unmarshal 的原码,无奈有些看不懂,求大神们指教。 最好能把我的playground的修改一下,那么我看的就更清楚了。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1823 次点击  
加入收藏 微博
10 回复  |  直到 2018-01-22 05:02:01
oscarzhou
oscarzhou · #1 · 7年之前

刚才实现了自己想要的结果,但是发现把整个东西弄的更麻烦了。

playground: https://play.golang.org/p/J1-y2o-FT-Z

感觉没有意义

tk103331
tk103331 · #2 · 7年之前

用反射试试

zydp
zydp · #3 · 7年之前

v.(yourtype) ???

jiang091308111
jiang091308111 · #4 · 7年之前

o,ok := object.(*User)

oscarzhou
oscarzhou · #5 · 7年之前
jiang091308111jiang091308111 #4 回复

o,ok := object.(*User)

嗯嗯,后来发现断言确实可以,但是如果是传入的类型是[]User,需要怎么去做呢?用断言好像检查不出[]User。谢谢

oscarzhou
oscarzhou · #6 · 7年之前
zydpzydp #3 回复

v.(yourtype) ???

这个确实可行,谢谢,但是要想将值 传出,还需要再考虑考虑

Prnyself
Prnyself · #7 · 7年之前

switch v.(type) { case []int:

switch是可以判断是不是[]User的

victorl
victorl · #8 · 7年之前

这种需求在自定义数据交换格式映射到数据结构对象要用到,例如json、xml、orm...

  1. 自定义struct字段的tag
  2. 再通过反射和类型转换把数据映射到对象

我觉得更好一点可以看一下protobuf

oscarzhou
oscarzhou · #9 · 7年之前
PrnyselfPrnyself #7 回复

`switch v.(type) {` ` case []int:` switch是可以判断是不是[]User的

哈哈,谢啦兄弟。

oscarzhou
oscarzhou · #10 · 7年之前
victorlvictorl #8 回复

这种需求在自定义数据交换格式映射到数据结构对象要用到,例如json、xml、orm... 1. 自定义struct字段的tag 2. 再通过反射和类型转换把数据映射到对象 我觉得更好一点可以看一下protobuf

嗯嗯,这个没有听过,我了解一下,谢谢啦

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传