day7函数 练习5.8
parent
23d290d7b8
commit
d33b37a04a
|
@ -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
|
||||||
|
}
|
Loading…
Reference in New Issue