Golang Go语言中抛块砖演示下 range over func 用法
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
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
不能直接用于函数,但我们可以结合匿名函数和高阶函数(如 map
和 filter
)来演示一种类似 “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
来遍历和处理数据。