为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go for 循环的 post 部分中分配如何允许此循环退出?

在 Go for 循环的 post 部分中分配如何允许此循环退出?

Go
LEATH 2023-06-05 17:38:44
我正在阅读“The Go Programming Language”一书,并在第 5 章中遇到了一个不寻常的 for 循环语法。我已经删减了下面的示例,但整个程序都在本书的 GitHub 页面上。type Node struct {    int                     NodeType    FirstChild, NextSibling *Node}func visit(n *Node) {  for c:= n.FirstChild; c != nil; c = c.NextSibling {    visit(c)  }}我脑海中的 C 解析器告诉我,它c.NextSibling总是指向 aNode或 be nil。在那种情况下,循环要么总是中断,要么永远继续。当c.NextSibling不是时nil,似乎循环正在退出,因为循环值与上一次迭代相同,但我在 Go语言规范中找不到任何东西来支持它。我已经编译了那个程序并确认它按照书上的那样工作。我错过了一些基本的东西还是这里发生了其他事情?
查看完整描述

1 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

c.NextSibling不为 nil 时,似乎循环正在退出,因为循环值与上一次迭代相同

不确定你的意思,但是是的,你误解了一些东西。但是for循环不是罪魁祸首。当它的继续条件仍然为真时,它肯定不会退出。

type Node struct {

    NodeId                  int

    FirstChild, NextSibling *Node

}


func visit(n *Node) {

    for c := n.FirstChild; c != nil; c = c.NextSibling {

        fmt.Printf("seeing node %d\n", c.NodeId)

        visit(c)

    }

}


func main() {

    c3 := &Node{NodeId: 4}

    c2 := &Node{NodeId: 3, NextSibling: c3}

    c1 := &Node{NodeId: 2, NextSibling: c2}

    root := &Node{NodeId: 1, FirstChild: c1}


    visit(root)

}

输出


seeing node 2

seeing node 3

seeing node 4


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信