ch5/ch5-07 #146
ch5/ch5-07
#146
Replies: 7 comments 1 reply
-
练习5.15package 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)
}
} |
Beta Was this translation helpful? Give feedback.
0 replies
-
练习 5.16package 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"))
} |
Beta Was this translation helpful? Give feedback.
0 replies
-
练习 5.17 - 判断map是否存在某一元素....package main
import (
"Study/src/study/day7Function/HtmlTools"
"fmt"
"golang.org/x/net/html"
)
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
} |
Beta Was this translation helpful? Give feedback.
1 reply
-
切片后面的...可以理解为解压缩 |
Beta Was this translation helpful? Give feedback.
0 replies
-
//5.15
func max(vals ...int) (int, bool) {
var asw int = math.MinInt
if len(vals) == 0 {
return asw, false
}
for _, val := range vals {
if val > asw {
asw = val
}
}
return asw, true
}
func min(vals ...int) (int, bool) {
var asw int = math.MaxInt
if len(vals) == 0 {
return asw, false
}
for _, val := range vals {
if val < asw {
asw = val
}
}
return asw, true
}
//5.16
func join(sep string, elems ...string) (string, bool) {
if len(elems) == 0 {
return "", false
}
var split string = ""
var res string
for _, elem := range elems {
res += split + elem
split = sep
}
return res, true
} |
Beta Was this translation helpful? Give feedback.
0 replies
-
//5.17
func ElementsByTagName(doc *html.Node, name ...string) []*html.Node {
var mp = make(map[string]bool)
var res = make([]*html.Node, 0)
for _, val := range name {
mp[val] = true
}
//BFS
var que = list.List{}
que.PushBack(doc)
for que.Len() != 0 {
var front = que.Front()
que.Remove(front)
var frontHtmlNode = front.Value.(*html.Node)
var tag = frontHtmlNode.Data
if mp[tag] == true {
res = append(res, frontHtmlNode)
}
for child := frontHtmlNode.FirstChild; child != nil; child = child.NextSibling {
que.PushBack(child)
}
}
return res
} |
Beta Was this translation helpful? Give feedback.
0 replies
-
练习5.15package main
import (
"errors"
"fmt"
)
func Max(nums ...int) (int, error) {
if len(nums) == 0 {
return 0, errors.New("no value provided")
}
maxNum := nums[0]
for _, num := range nums {
if num > maxNum {
maxNum = num
}
}
return maxNum, nil
}
func Min(nums ...int) (int, error) {
if len(nums) == 0 {
return 0, errors.New("no value provided")
}
minNum := nums[0]
for _, num := range nums {
if num < minNum {
minNum = num
}
}
return minNum, nil
}
func main() {
// 测试 max 和 min 函数
if maxValue, err := Max(1, 3, 6, 2); err == nil {
fmt.Println("Max:", maxValue)
} else {
fmt.Println(err)
}
if minValue, err := Min(1, 3, 6, 2); err == nil {
fmt.Println("Min:", minValue)
} else {
fmt.Println(err)
}
// 测试没有参数时的情况
if _, err := Max(); err != nil {
fmt.Println("Error:", err)
}
if _, err := Min(); err != nil {
fmt.Println("Error:", err)
}
} |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
ch5/ch5-07
中文版
https://golang-china.github.io/gopl-zh/ch5/ch5-07.html
Beta Was this translation helpful? Give feedback.
All reactions