Golang Go语言中抛块砖演示下 range over func 用法

发布于 1周前 作者 eggper 来自 Go语言
package main

import “container/list”

type List[T any] list.List

func (c *List[T]) getList() *list.List { return (*list.List)© }

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) } }


Golang Go语言中抛块砖演示下 range over func 用法

更多关于Golang Go语言中抛块砖演示下 range over func 用法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

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 行, 虽然情况也比这个复杂很多.

更多关于Golang Go语言中抛块砖演示下 range over func 用法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,range 关键字通常用于遍历数组、切片、字符串、映射(map)以及通道(channel)。虽然 range 不能直接用于函数,但我们可以结合匿名函数和高阶函数(如 mapfilter)来演示一种类似 “range over func” 的效果。

这里,我们通过 map 函数来演示如何对切片中的每个元素应用一个函数,并使用 range 来遍历和修改这些元素:

package main

import (
	"fmt"
)

func main() {
	nums := []int{1, 2, 3, 4, 5}

	// 定义一个匿名函数,用于将每个元素乘以2
	squared := map[int]int(func(x int) int { return x * x })(nums...)

	// 使用 range 来遍历结果
	for i, v := range squared {
		fmt.Printf("Index: %d, Value: %d\n", i, v)
	}
}

// 注意:上面的 map[int]int(func(x int) int { ... })(nums...) 是伪代码,用于说明思路。
// 在Go中,map函数需要显式实现,因为Go标准库不提供直接对切片进行映射的函数。
// 正确实现如下:
func mapFunc(nums []int, f func(int) int) []int {
	result := make([]int, len(nums))
	for i, n := range nums {
		result[i] = f(n)
	}
	return result
}

// 在main中使用mapFunc
squared := mapFunc(nums, func(x int) int { return x * x })

这个例子展示了如何定义一个高阶函数 mapFunc,并使用 range 来遍历和处理数据。

回到顶部