day7函数 练习5.8

master
独孤伶俜 2022-12-07 00:29:54 +08:00
parent 23d290d7b8
commit d33b37a04a
1 changed files with 101 additions and 0 deletions

View File

@ -0,0 +1,101 @@
package main
import (
"Study/src/study/day7Function/HtmlTools"
"fmt"
"golang.org/x/net/html"
)
func main() {
// 定义变量类型为函数func(n *html.Node, pre func(doc *html.Node, id string) *html.Node, id string)
// pre 参数规定了必须传入一个函数类型的变量,
// 有两个参数doc和id, 返回值类型为 *html.Node
//var forEachNode func(n *html.Node, pre func(doc *html.Node, id string) *html.Node, id string) *html.Node
//// 实现此函数
//forEachNode = func(n *html.Node, pre func(doc *html.Node, id string) *html.Node, id string) *html.Node {
// c := n.FirstChild
// if pre != nil && pre(n, id) != nil {
// fmt.Println(n.Data)
// return c
// }
// for ; c != nil; c = c.NextSibling {
// // 递归调用,逐级遍历
// forEachNode(c, pre, id)
// }
// return nil
//}
//// 定义需要传入的函数
//var ElementByID func(doc *html.Node, id string) *html.Node
//ElementByID = func(doc *html.Node, id string) *html.Node {
// if doc == nil {
// return nil
// } else if doc.Type == html.ElementNode && doc.Data == id {
// fmt.Println(doc.Data)
// return doc
// }
// return nil
//}
////调用
//forEachNode(HtmlTools.GetHtml(), ElementByID, "a")
var each func(doc *html.Node) func(id string) *html.Node
each = func(doc *html.Node) func(id string) *html.Node {
if doc == nil {
return func(id string) *html.Node {
fmt.Println("0")
if doc.Type == html.ElementNode && doc.Data == id {
fmt.Print(doc.Data)
ResultNode = doc
fmt.Println("ret: id")
return ResultNode
}
return ResultNode
}
}
each(doc.FirstChild)
each(doc.NextSibling)
return func(id string) *html.Node {
fmt.Println("1")
if doc.Type == html.ElementNode && doc.Data == id {
fmt.Print("data", doc.Data)
ResultNode = doc
fmt.Println("ret: id")
return ResultNode
}
fmt.Println("4")
return ResultNode
}
}
//each1 := each(HtmlTools.GetHtml())
//each1("a")
// 手动清除ResultNode的内容
ResultNode = nil
ElementByID(HtmlTools.GetHtml(), pre, "a")
}
var ResultNode *html.Node = nil
func ElementByID(doc *html.Node, pre func(n *html.Node, id *string) bool, id string) *html.Node {
if doc != nil && ResultNode == nil {
ElementByID(doc.FirstChild, pre, id)
ElementByID(doc.NextSibling, pre, id)
} else {
return nil
}
if pre(doc, &id) {
return nil
}
return nil
}
func pre(n *html.Node, id *string) bool {
if n.Type == html.ElementNode && n.Data == *id {
fmt.Println(n.Data)
ResultNode = n
return true
}
return false
}