我主要使用Python,但是正在玩Go。我写了下面的代码来做一些在python中非常简单的事情,希望它也可以在Go中完成。
package main
import (
"bytes"
"encoding/gob"
"fmt"
"io/ioutil"
)
type Order struct {
Text string
User *User
}
type User struct {
Text string
Order *Order
}
func main() {
o := Order{}
u := User{}
o.Text = "order text"
u.Text = "user text"
// commenting this section prevents stack overflow
o.User = &u
u.Order = &o
fmt.Println("o.u.text:", o.User.Text, "u.o.text:", u.Order.Text)
// end section
m := new(bytes.Buffer)
enc := gob.NewEncoder(m)
enc.Encode(o)
err := ioutil.WriteFile("gob_data", m.Bytes(), 0600)
if err != nil {
panic(err)
}
fmt.Printf("just saved gob with %v\n", o)
n, err := ioutil.ReadFile("gob_data")
if err != nil {
fmt.Printf("cannot read file")
panic(err)
}
p := bytes.NewBuffer(n)
dec := gob.NewDecoder(p)
e := Order{}
err = dec.Decode(&e)
if err != nil {
fmt.Printf("cannot decode")
panic(err)
}
fmt.Printf("just read gob from file and it's showing: %v\n", e)
}
如您所见,有两个自定义结构,每个自定义结构都递归地包含对另一个的引用。当我尝试使用gob将一个文件打包到一个文件中时,它会编译,但是出现堆栈溢出,我认为这是由递归引起的。以我的经验,泡菜会像处理抽水一样轻松。我究竟做错了什么?
到目前为止,该encoding/gob
程序包不适用于递归值:
递归类型可以正常工作,但是递归值(带有循环的数据)存在问题。这可能会改变。
在此更改之前,您将要么不使用循环数据,要么使用其他方法进行序列化。
问题内容: 如何扩展结构定义以显示嵌套类型?例如,我想扩展这个 像这样: 上下文:对现有代码进行逆向工程。 问题答案: 您可以尝试按照以下方式进行操作,以列出结构中定义的所有字段,然后递归列出以这种方式找到的结构。 它不能完全产生您所要求的输出,但是非常接近,并且可以进行调整。 由于上述原因,我得到了此输出:
下面的例子中,main.go 使用了一个结构体,它来自 struct_pack 下的包 structPack。 示例 10.5 structPack.go: package structPack type ExpStruct struct { Mi1 int Mf1 float32 } 示例 10.6 main.go: package main import ( "fmt
我试图以相反的顺序打印一个链表,但实际上没有使用递归进行反转,但我的输出结果非常奇怪。看起来我的代码基本上选择了第一个节点,并在打印完链表的其余部分(按原始顺序)后将其打印出来。我所写的代码(据我所知)是正确的,并且与internet上解决此问题的代码相匹配。 这是我的代码: 以下是节点类: 这是我给出的输入,然后是输出: 这里发生的另一个奇怪的事情是,如果我改变递归的条件,假设我这样做: 然后是
我在Hackerrank上解决反向挑战的指纹 方法接受一个参数-链表的头部。您不应该从stdin/console中读取任何输入。头部可能是空的,所以不应该打印任何东西。按照与stdout/console相反的顺序打印链表的元素(使用printf或cout),每行一个。 NB:节点的结构为struct Node{int data;struct Node*next;}
本文向大家介绍使用递归[JavaScript]创建层次结构,包括了使用递归[JavaScript]创建层次结构的使用技巧和注意事项,需要的朋友参考一下 示例 输出
12.3. Display,一个递归的值打印器 接下来,让我们看看如何改善聚合数据类型的显示。我们并不想完全克隆一个fmt.Sprint函数,我们只是构建一个用于调试用的Display函数:给定任意一个复杂类型 x,打印这个值对应的完整结构,同时标记每个元素的发现路径。让我们从一个例子开始。 e, _ := eval.Parse("sqrt(A / pi)") Display("e", e) 在