做力扣的二叉树中序遍历时学习到,golang不支持函数内直接声明函数,但是支持函数内使用匿名函数,或者创建函数类型的变量。
如:
func main() { func say() { // 这里会包语法错误,不能在main函数内声明函数。 fmt.Println("Hello") } }
但是可以使用变量声明:
func main() { say := func() { fmt.Println("Hello") } }
或者如此使用递归
unc main() { var say func(x *int) //这里注意,要使用带传参的函数时,变量的类型中也要写明传参类型 say = func(x *int) { if *x == 0 { fmt.Println(*x) return } else { fmt.Println(*x) *x-- say(x) } } x := 10 say(&x) }
涉及到的力扣刷题中序遍历的递归实现:
func inorderTraversal(root *TreeNode) (res []int) {
var inorder func(node *TreeNode) //通过变量声明实现函数内声明函数并递归
inorder = func(node *TreeNode) {
if node == nil {
return
}
inorder(node.Left)
res = append(res, node.Val)
inorder(node.Right)
}
inorder(root)
return
}