day7函数 递归 递归练习题
parent
5df6dc2c5a
commit
f9c06f7b5a
2
go.mod
2
go.mod
|
@ -1,3 +1,5 @@
|
||||||
module Study
|
module Study
|
||||||
|
|
||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
|
require golang.org/x/net v0.2.0 // indirect
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU=
|
||||||
|
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
|
|
@ -8,7 +8,7 @@ import (
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
http.HandleFunc("/", handler1)
|
http.HandleFunc("/", handler1)
|
||||||
log.Fatal(http.ListenAndServe("localhost:8090", nil))
|
log.Fatal(http.ListenAndServe("localhost:8989", nil))
|
||||||
}
|
}
|
||||||
|
|
||||||
func handler1(w http.ResponseWriter, r *http.Request) {
|
func handler1(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"golang.org/x/net/html"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
type man struct {
|
||||||
|
sex bool
|
||||||
|
name string
|
||||||
|
action func()
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
var dug man
|
||||||
|
dug.name = "dugulingping"
|
||||||
|
dug.action = func() {
|
||||||
|
fmt.Println("Hi " + dug.name)
|
||||||
|
}
|
||||||
|
fmt.Printf("%T\n", dug.action)
|
||||||
|
dug.action()
|
||||||
|
|
||||||
|
resp, err := http.Get("https://golang-china.github.io/gopl-zh/ch5/ch5-02.html")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
err := resp.Body.Close()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
doc, err := html.Parse(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 关闭链接
|
||||||
|
err = resp.Body.Close()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
node := make(map[string]int)
|
||||||
|
v(node, doc)
|
||||||
|
//fmt.Println(node)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func v(node map[string]int, n *html.Node) map[string]int {
|
||||||
|
if n == nil {
|
||||||
|
return node
|
||||||
|
}
|
||||||
|
if n.Type == html.ElementNode {
|
||||||
|
node[n.Data] += 1
|
||||||
|
//fmt.Println(n.Data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if n.Type == html.TextNode {
|
||||||
|
if n.Data != "script" && n.Data != "style" {
|
||||||
|
//fmt.Println(n.Data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
node = v(node, n.FirstChild)
|
||||||
|
node = v(node, n.NextSibling)
|
||||||
|
return node
|
||||||
|
}
|
||||||
|
func v4(links []string, n *html.Node) []string {
|
||||||
|
if n == nil {
|
||||||
|
return links
|
||||||
|
}
|
||||||
|
if n.Type == html.ElementNode && (n.Data == "a" || n.Data == "images" || n.Data == "scripts") {
|
||||||
|
for _, a := range n.Attr {
|
||||||
|
if a.Key == "href" {
|
||||||
|
links = append(links, a.Val)
|
||||||
|
//fmt.Println(a.Val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
links = v4(links, n.FirstChild)
|
||||||
|
links = v4(links, n.NextSibling)
|
||||||
|
return links
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
// 递归,函数可以直接或间接的调用自身。
|
||||||
|
// 对许多问题而言,递归是一种强有力的技术,
|
||||||
|
// 例如处理递归的数据结构。
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"golang.org/x/net/html"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
doc, err := html.Parse(os.Stdin)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "findlinks1: %v\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
//fmt.Println(doc.NextSibling.Data)
|
||||||
|
for _, link := range visit(nil, doc.FirstChild) {
|
||||||
|
fmt.Println(link)
|
||||||
|
}
|
||||||
|
//outline(nil, doc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// visit appends to links each link found in n and returns the result.
|
||||||
|
func visit(links []string, n *html.Node) []string {
|
||||||
|
if n == nil {
|
||||||
|
return links
|
||||||
|
}
|
||||||
|
if n.Type == html.ElementNode && n.Data == "a" {
|
||||||
|
for _, a := range n.Attr {
|
||||||
|
if a.Key == "href" {
|
||||||
|
links = append(links, a.Val)
|
||||||
|
//fmt.Println(a.Val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//for c := n.FirstChild; c != nil; c = c.NextSibling {
|
||||||
|
// links = visit(links, c)
|
||||||
|
//}
|
||||||
|
//if n != nil {
|
||||||
|
// links = visit(links, n.NextSibling)
|
||||||
|
//}
|
||||||
|
links = visit(links, n.FirstChild)
|
||||||
|
links = visit(links, n.NextSibling)
|
||||||
|
return links
|
||||||
|
}
|
||||||
|
func outline(stack []string, n *html.Node) []string {
|
||||||
|
if n.Type == html.ElementNode {
|
||||||
|
stack = append(stack, n.Data)
|
||||||
|
fmt.Println(stack)
|
||||||
|
}
|
||||||
|
for c := n.FirstChild; c != nil; c = c.NextSibling {
|
||||||
|
outline(stack, c)
|
||||||
|
}
|
||||||
|
return stack
|
||||||
|
}
|
Loading…
Reference in New Issue