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