V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
noobCoderZzz
V2EX  ›  Go 编程语言

[提问] 刚接触 golang,想问一下为什么不能序列化 html 包里面的 Node 类型?

  •  
  •   noobCoderZzz · 2020-06-07 23:00:33 +08:00 · 3198 次点击
    这是一个创建于 1635 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如下:

    node, _ := html.Parse(response.Body)
    nodeString,err := json.Marshal(node)
    fmt.Println(err)
    

    报异常如下:
    json: unsupported value: encountered a cycle via *html.Node

    是因为 Node 包含了*Node 类型的字段?对于这种循环嵌套的对象有办法做到序列化吗?
    附 Node 的代码

    type Node struct {
    	Parent, FirstChild, LastChild, PrevSibling, NextSibling *Node
    
    	Type      NodeType
    	DataAtom  atom.Atom
    	Data      string
    	Namespace string
    	Attr      []Attribute
    }
    
    9 条回复    2020-06-10 20:07:51 +08:00
    boboliu
        1
    boboliu  
       2020-06-07 23:07:14 +08:00
    一般来讲,受限于 go 的强权限控制和弱鸡反射,正常的 go 用户不会选择直接序列化一个内部使用的结构体,你可以选择定义一个用于数据交换的结构体进行序列化和反序列化
    noobCoderZzz
        2
    noobCoderZzz  
    OP
       2020-06-07 23:52:21 +08:00
    @boboliu 我主要是想打印出来看看这个实体的结构和内容 goland debug 下显示的结构看的我很难受。。。 另外问一下 goland 的调试是不可逆的吗?别的语言都支持拖拽调试的游标,goland 怎么才能回到前几步?
    reus
        3
    reus  
       2020-06-08 00:19:08 +08:00
    @boboliu https://pkg.go.dev/golang.org/x/net/html?tab=doc#Node 看定义,字段全都是公有的,何来“内部使用的结构体”?

    报错都告诉你原因了,有环,也就是有 *html.Node 类型的成员指向了自身。这种带环的结构,换成任何语言,都很难序列化。
    joesonw
        4
    joesonw  
       2020-06-08 09:56:12 +08:00   ❤️ 1
    试试 litter
    neoblackcap
        5
    neoblackcap  
       2020-06-08 10:58:15 +08:00
    @noobCoderZzz 退回前几步?应该都是可以的,不就是倒回去之前几个栈嘛,如果你觉得还不够,要不上 mozilla 的 rr debugger
    liuhan907
        6
    liuhan907  
       2020-06-08 13:00:22 +08:00 via Android
    @reus 其实,C#一直都有对带环对象的序列化支持。
    boboliu
        7
    boboliu  
       2020-06-08 14:40:25 +08:00
    @reus #3 啊是我瞎了,昨晚有点困没看清
    noobCoderZzz
        8
    noobCoderZzz  
    OP
       2020-06-10 19:58:55 +08:00
    @neoblackcap 没找到。。 比如 idea 和 rider,debug 的时候游标是可以随便拖的,goland 根本不能拖
    noobCoderZzz
        9
    noobCoderZzz  
    OP
       2020-06-10 20:07:51 +08:00
    @joesonw 感谢 非常有用 就是我想找到功能!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4061 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:15 · PVG 18:15 · LAX 02:15 · JFK 05:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.