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