day7函数 练习
parent
2734edb601
commit
70b913091c
|
@ -0,0 +1,124 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"Study/src/study/day7Function/HtmlTools"
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"golang.org/x/net/html"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ElementsByTagName(doc *html.Node, name ...string) []*html.Node {
|
||||||
|
// 创建一个map, 用于保存传入的tag name和是否已被找到的状态
|
||||||
|
tags := make(map[string]bool)
|
||||||
|
for _, tag := range name {
|
||||||
|
tags[tag] = false
|
||||||
|
}
|
||||||
|
// 创建用于保存查找到的元素的切片
|
||||||
|
var elements []*html.Node
|
||||||
|
// 声明查找函数
|
||||||
|
var visit func(*html.Node)
|
||||||
|
visit = func(n *html.Node) {
|
||||||
|
// 如果当前节点是html元素节点
|
||||||
|
if n.Type == html.ElementNode {
|
||||||
|
// 检测tags中是否存在 n.Data
|
||||||
|
// 该版本为只返回找到的第一个节点node
|
||||||
|
// 如果要找到doc节点下所有的符合条件的node的话
|
||||||
|
// 请打开下面这行代码, 这行代码表示只会检查tags map里是否存在n.Data
|
||||||
|
//if _, ok := tags[n.Data]; ok {
|
||||||
|
// 并注释掉下面的这一行代码, 这行表示会同时检查是否存在和是否添加过同名节点
|
||||||
|
if isFind, ok := tags[n.Data]; ok && !isFind {
|
||||||
|
// 将该元素加入到结果切片中
|
||||||
|
elements = append(elements, n)
|
||||||
|
// 标记该tag name已被查找到
|
||||||
|
tags[n.Data] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 递归查找子节点
|
||||||
|
for c := n.FirstChild; c != nil; c = c.NextSibling {
|
||||||
|
visit(c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 从传入的文档节点开始查找
|
||||||
|
visit(doc)
|
||||||
|
// 返回查找到的元素切片
|
||||||
|
return elements
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
doc := HtmlTools.GetHtml()
|
||||||
|
images := ElementsByTagName(doc, "img")
|
||||||
|
headings := ElementsByTagName(doc, "h1", "h2", "h3", "h4", "a", "div")
|
||||||
|
for _, v := range images {
|
||||||
|
fmt.Println(v.Data)
|
||||||
|
}
|
||||||
|
fmt.Println()
|
||||||
|
for _, v := range headings {
|
||||||
|
fmt.Println(v.Data)
|
||||||
|
}
|
||||||
|
|
||||||
|
//⚠️当需要检测一个mao中是否存在某一元素时,使用以下代码
|
||||||
|
// v, ok := m2["a"]
|
||||||
|
// v 是 这个map["a"]的值 即 v == m2["a"]
|
||||||
|
// ok是一个bool值, 当m2这个map存在a这个元素时, ok值为true, 反之则为false
|
||||||
|
m2 := make(map[string]any)
|
||||||
|
m2["a"] = "aaa"
|
||||||
|
m2["b"] = "bbb"
|
||||||
|
m2["c"] = "ccc"
|
||||||
|
v, ok := m2["a"]
|
||||||
|
fmt.Println("a ", ok, v) // true, aaa
|
||||||
|
_, ok = m2["b"]
|
||||||
|
fmt.Println("b ", ok) // true
|
||||||
|
_, ok = m2["c"]
|
||||||
|
fmt.Println("c ", ok) // true
|
||||||
|
_, ok = m2["d"]
|
||||||
|
fmt.Println("d ", ok) // false
|
||||||
|
_, ok = m2["e"]
|
||||||
|
fmt.Println("e ", ok) // false
|
||||||
|
_, ok = m2["f"]
|
||||||
|
fmt.Println("f ", ok) // false
|
||||||
|
|
||||||
|
var buf *bytes.Buffer
|
||||||
|
//fmt.Printf("buf: \t(%T, %[1]v)\n", buf)
|
||||||
|
f(buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If out is non-nil, output will be written to it.
|
||||||
|
func f(out io.Writer) {
|
||||||
|
// ...do something...
|
||||||
|
var a *bytes.Buffer // 结构体空指针
|
||||||
|
var b io.Writer // io.write 接口
|
||||||
|
var c interface{} // 空接口
|
||||||
|
var d io.Writer = a
|
||||||
|
|
||||||
|
fmt.Printf("a: \t(%T, %[1]v)\n", a)
|
||||||
|
fmt.Printf("b: \t(%T, %[1]v)\n", b)
|
||||||
|
fmt.Printf("c: \t(%T, %[1]v)\n", c)
|
||||||
|
fmt.Printf("d: \t(%T, %[1]v)\n", d)
|
||||||
|
fmt.Printf("out: \t(%T, %[1]v)\n", out)
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println("a == b", a == b)
|
||||||
|
fmt.Println("a == c", a == c)
|
||||||
|
fmt.Println("a == d", a == d)
|
||||||
|
fmt.Println("a == out", a == out)
|
||||||
|
fmt.Println("a == nil", a == nil)
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println("b == c", b == c)
|
||||||
|
fmt.Println("b == d", b == d)
|
||||||
|
fmt.Println("b == out", b == out)
|
||||||
|
fmt.Println("b == nil", b == nil)
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println("c == d", c == d)
|
||||||
|
fmt.Println("c == out", c == out)
|
||||||
|
fmt.Println("c == nil", c == nil)
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println("d == out", d == out)
|
||||||
|
fmt.Println("d == nil", d == nil)
|
||||||
|
|
||||||
|
fmt.Println("out == nil", out == nil)
|
||||||
|
if out != a {
|
||||||
|
fmt.Fprintf(out, "Hello, %s!\n", "world")
|
||||||
|
//fmt.Printf("(%T, %[1]v)\n", out)
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
|
@ -0,0 +1,66 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"Study/src/study/day7Function/HtmlTools"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// 有向无环图
|
||||||
|
var prereqs = map[string][]string{
|
||||||
|
"algorithms": {"data structures"},
|
||||||
|
"linear algebra": {"calculus"},
|
||||||
|
"calculus": {"linear algebra"},
|
||||||
|
"compilers": {
|
||||||
|
"data structures",
|
||||||
|
"formal languages",
|
||||||
|
"computer organization",
|
||||||
|
},
|
||||||
|
"data structures": {"discrete math"},
|
||||||
|
"databases": {"data structures"},
|
||||||
|
"discrete math": {"intro to programming"},
|
||||||
|
"formal languages": {"discrete math"},
|
||||||
|
"networks": {"operating systems"},
|
||||||
|
"operating systems": {"data structures", "computer organization"},
|
||||||
|
"programming languages": {"data structures", "computer organization"},
|
||||||
|
}
|
||||||
|
breadthFirstDigraph(prereqs)
|
||||||
|
|
||||||
|
}
|
||||||
|
func breadthFirstDigraph(m map[string][]string) []string {
|
||||||
|
|
||||||
|
var worklist, res []string
|
||||||
|
// 将第一层节点加入到队列
|
||||||
|
for k, _ := range m {
|
||||||
|
worklist = append(worklist, k)
|
||||||
|
}
|
||||||
|
// seen
|
||||||
|
seen := make(map[string]bool)
|
||||||
|
for len(worklist) > 0 {
|
||||||
|
// 复制当前队列
|
||||||
|
items := worklist
|
||||||
|
// 清空队列
|
||||||
|
worklist = nil
|
||||||
|
// 遍历复制的当前队列
|
||||||
|
for _, item := range items {
|
||||||
|
// 判断seen, 防止重复添加到队列
|
||||||
|
if !seen[item] {
|
||||||
|
seen[item] = true
|
||||||
|
// 添加到队列
|
||||||
|
worklist = append(worklist, m[item]...)
|
||||||
|
fmt.Println(item)
|
||||||
|
res = append(res, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
func crawl(url string) []string {
|
||||||
|
fmt.Println(url)
|
||||||
|
list, err := HtmlTools.Extract()
|
||||||
|
if err != nil {
|
||||||
|
log.Print(err)
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 上面的代码中,maxMin 函数接收可变参数,并返回参数中的最大值和最小值。
|
||||||
|
// 如果参数个数为0,则返回错误。
|
||||||
|
// maxMin 函数接收可变参数,并返回最大值和最小值
|
||||||
|
func maxMin(nums ...int) (max int, min int, err error) {
|
||||||
|
// 如果参数个数为0,则返回错误
|
||||||
|
err = fmt.Errorf("err: 参数个数为0")
|
||||||
|
if len(nums) == 0 {
|
||||||
|
return 0, 0, err
|
||||||
|
}
|
||||||
|
// 初始化最小值为最大整数
|
||||||
|
min = math.MaxInt
|
||||||
|
// 遍历所有参数,求最大值和最小值
|
||||||
|
for _, num := range nums {
|
||||||
|
if num > max {
|
||||||
|
max = num
|
||||||
|
}
|
||||||
|
if num < min {
|
||||||
|
min = num
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max, min, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var maxNum, minNum int
|
||||||
|
// 可以选择处理错误, 也可以选择不处理,直接丢弃掉
|
||||||
|
maxNum, minNum, _ = maxMin(4, 2, 3)
|
||||||
|
fmt.Println(maxNum, minNum)
|
||||||
|
// 也可以选择处理此错误
|
||||||
|
maxNum, minNum, err := maxMin()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Join 函数接受一个分隔符 sep 和一个可变长度的字符串元素 elems,
|
||||||
|
// 并将 elems 中的元素用 sep 分隔符连接起来,返回连接后的字符串。
|
||||||
|
func Join(sep string, elems ...string) string {
|
||||||
|
// 处理特殊情况。
|
||||||
|
switch len(elems) {
|
||||||
|
case 0:
|
||||||
|
// 如果 elems 为空,返回空字符串。
|
||||||
|
return ""
|
||||||
|
case 1:
|
||||||
|
// 如果 elems 只有一个元素,返回该元素。
|
||||||
|
return elems[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算连接后的字符串长度。
|
||||||
|
n := len(sep) * (len(elems) - 1)
|
||||||
|
for i := 0; i < len(elems); i++ {
|
||||||
|
n += len(elems[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用 strings.Builder 来高效地构建连接后的字符串。
|
||||||
|
var b strings.Builder
|
||||||
|
b.Grow(n)
|
||||||
|
b.WriteString(elems[0])
|
||||||
|
for _, s := range elems[1:] {
|
||||||
|
b.WriteString(sep)
|
||||||
|
b.WriteString(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回连接后的字符串。
|
||||||
|
return b.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// 不太懂这个题的意思
|
||||||
|
// 是将 elems 切片参数改为可变参数吗?
|
||||||
|
str := []string{"a", "b", "c", "d", "e", "f"}
|
||||||
|
// str... 为解切片操作。
|
||||||
|
fmt.Println(Join("-", str...))
|
||||||
|
fmt.Println(Join(",", "abc", "def", "ghi"))
|
||||||
|
}
|
Loading…
Reference in New Issue