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

抛块砖演示下 range over func 用法

  •  
  •   Nazz · 128 天前 · 1238 次点击
    这是一个创建于 128 天前的主题,其中的信息可能已经有所发展或是发生改变。
    package main
    
    import "container/list"
    
    type List[T any] list.List
    
    func (c *List[T]) getList() *list.List { return (*list.List)(c) }
    
    func (c *List[T]) PushBack(v T) { c.getList().PushBack(v) }
    
    func (c *List[T]) Range(f func(i int, v T) bool) {
    	for i, j := c.getList().Front(), 0; i != nil; i = i.Next() {
    		if !f(j, i.Value.(T)) {
    			return
    		}
    		j++
    	}
    }
    
    func main() {
    	q := new(List[int])
    	q.PushBack(1)
    	q.PushBack(1)
    	q.PushBack(2)
    	q.PushBack(3)
    	q.PushBack(5)
    	for i, v := range q.Range {
    		println(i, v)
    	}
    }
    
    
    2 条回复    2024-08-21 19:16:15 +08:00
    MoYi123
        1
    MoYi123  
       128 天前
    type Node struct {
    Left *Node
    Right *Node
    Val int
    }
    type TreeVisiter struct {
    root *Node
    }

    func makeNode(val int) *Node {
    return &Node{Val: val}
    }

    func (fr *TreeVisiter) InOrder(visit func(*Node) bool) {
    fr.p_inOrder(visit, fr.root)
    }

    func (fr *TreeVisiter) p_inOrder(visit func(*Node) bool, cur *Node) {
    if cur.Left != nil {
    if !visit(cur.Left) {
    return
    }
    }
    if !visit(cur) {
    return
    }
    if cur.Right != nil {
    if !visit(cur.Right) {
    return
    }
    }
    }

    func main() {
    root := makeNode(2)
    root.Left = makeNode(1)
    root.Right = makeNode(3)
    tv := TreeVisiter{root: root}
    for node := range tv.InOrder {
    if node.Val == 1 {
    fmt.Printf("first node is %d\n", node.Val)
    }
    if node.Val == 2 {
    fmt.Printf("second node is %d\n", node.Val)
    break
    }
    }
    }


    中序遍历二叉树, 这个至少比 cpp 的 begin,end 好多了,
    我公司项目里写的 cpp 的用来遍历树的 forward_iterator 写了快 300 行, 虽然情况也比这个复杂很多.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3062 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 13:50 · PVG 21:50 · LAX 05:50 · JFK 08:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.