diff --git a/src/study/day6/map.go b/src/study/day6/map.go index c08f4d9..e89dd29 100644 --- a/src/study/day6/map.go +++ b/src/study/day6/map.go @@ -38,7 +38,7 @@ func main() { map1["bob"] = map1["bob"] + 1 fmt.Println(map1) fmt.Println(map1["qaq"]) // 0 - + print("ll") // x += y, x++等简短赋值语句在map上也适用 map1["bob"] += 1 fmt.Println(map1["bob"]) // 2 diff --git a/src/study/day6/treesort.go b/src/study/day6/treesort.go index 6e7be5e..8241114 100644 --- a/src/study/day6/treesort.go +++ b/src/study/day6/treesort.go @@ -32,7 +32,6 @@ func add(t *tree, value int) *tree { t.value = value return t } - if value < t.value { t.left = add(t.left, value) //fmt.Println("left", t.value) @@ -43,7 +42,6 @@ func add(t *tree, value int) *tree { //fmt.Println(value) return t } - func main() { var nums []int = []int{4, 5, 43, 323, 45, 98, 4, 5, 7, 8, 1, 3, 2, 565} fmt.Println(nums) diff --git a/src/study/day7Function/ErrorProcess.go b/src/study/day7Function/ErrorProcess.go new file mode 100644 index 0000000..ad1d2a6 --- /dev/null +++ b/src/study/day7Function/ErrorProcess.go @@ -0,0 +1,97 @@ +package main + +import ( + "bufio" + "errors" + "fmt" + "io" + "log" + "os" +) + +type Myerror struct { + error +} + +func (Myerror) Error() string { + //TODO implement me + fmt.Println("俺真的错了!") + panic("implement me") +} + +const ( + Error = iota + 31 + Info + Warn + Debug + Panic +) + +func ProcessErrStr(c int, s error) string { + return fmt.Sprintf("\x1b[0;%dm%v\x1b[0m", c, s) +} + +func main() { + // errors.New方法可以字符串创建一个error + // 类似于fmt.Errorf方法 + CheckStr := func(s string) error { + if s == "" { + return errors.New("the str must be not empty") + } + return nil + } + //fmt.Println(CheckStr("")) + //fmt.Println(CheckStr("abc")) + + // 当错误发生后,一般有三种方式来处理错误 + + // 第一种,使用fmt.Fprintf方法将错误打印到stderr, 并终止程序 + if err := CheckStr(""); err != nil { + if _, err := fmt.Fprintf(os.Stderr, "1. %v\n", ProcessErrStr(Panic, err)); err != nil { + os.Exit(1) + } + } + + // 第二种,使用log.Fatalf,这种方式等于是上面的那种方法,都是输出致命的错误后,退出程序 + // 调用log.Fatalf可以更简洁的代码达到与上文相同的效果。log中的所有函数,都默认会在错误信息之前输出时间信息。 + // 等价于{Printf(v...); os.Exit(1)} + //if err := CheckStr(""); err != nil { + // log.Fatalf("2. %v\n", ProcessErrStr(Error, err)) + //} + // 我们也可以屏蔽掉log的日期输出 + /* see https://www.flysnow.org/2017/05/06/go-in-action-go-log */ + log.SetPrefix(ProcessErrStr(Error, errors.New("ERR: "))) + log.SetFlags(log.Ldate | log.Ltime | log.LUTC | log.Lshortfile) + //if err := CheckStr(""); err != nil { + // log.Fatalf("2.1. %v\n", ProcessErrStr(Error, err)) + //} + + // 最后我们也可以直接忽略到错误的发生,不做处理, 仅做stdout输出。 + if err := CheckStr(""); err != nil { + if _, err := fmt.Fprintf(os.Stdout, "3. %v\n", ProcessErrStr(Panic, err)); err != nil { + log.Fatalln("标准输出失败") + } + } + + // error错误有时并不是代表致命错误,或者程序运行错误,而是根据错误类型,做出不同的相应 + // 其中EOF错误就是一种,调用者会重复的读取固定大小的数据直到文件结束。 + // 这会导致调用者必须分别处理由文件结束引起的各种错误。 + readFile := func() error { + in := bufio.NewReader(os.Stdin) + for { + r, _, err := in.ReadRune() + if err == io.EOF { + break // finished reading + } + if err != nil { + return fmt.Errorf("read failed:%v", err) + } + // ...use r… + fmt.Println(r) + } + return nil + } + if err := readFile(); err != nil { + log.Fatalln("EOF!") + } +} diff --git a/src/study/day7Function/MultiReturn.go b/src/study/day7Function/MultiReturn.go new file mode 100644 index 0000000..410547a --- /dev/null +++ b/src/study/day7Function/MultiReturn.go @@ -0,0 +1,65 @@ +package main + +import ( + "errors" + "fmt" + "time" +) + +// go中 函数可以拥有多个返回值, + +func BothAdd(a, b int, action func(nun int) int) (int, int, error) { + if a == 0 || b == 0 { + return 0, 0, errors.New("the num must not be 0") + } + return action(a), action(b), nil +} +func Add(num int) int { + num++ + return num + +} +func PointAdd(num *int) { + *num++ +} + +func Concat2(a string, bOptional ...int) string { + b := 5 + if len(bOptional) > 0 { + b = bOptional[0] + } + + return fmt.Sprintf("%s%d", a, b) +} +func swap(a, b int) (int, int) { + a, b = b, a + return a, b + +} + +func Sum[T int | float64](a, b T) T { + return a + b +} + +func APprint(s chan string) { + for i := 0; i < 10; i++ { + fmt.Println(<-s) + time.Sleep(time.Second) + } +} +func main() { + str := make(chan string, 5) + go APprint(str) + go APprint(str) + for true { + str <- "aaa" + str <- "\\CCC" + } + time.Sleep(time.Second * 20) + //fmt.Println(Sum[int](1, 2)) + //fmt.Println(Sum(1.23, 2.3)) + //number := 233 + //PointAdd(&number) + //fmt.Println(number) + +} diff --git a/src/study/day7Function/Recursive.go b/src/study/day7Function/Recursive.go index 2072ecb..323aa70 100644 --- a/src/study/day7Function/Recursive.go +++ b/src/study/day7Function/Recursive.go @@ -18,14 +18,14 @@ func main() { os.Exit(1) } //fmt.Println(doc.NextSibling.Data) - for _, link := range visit(nil, doc.FirstChild) { + 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 { +func Visit(links []string, n *html.Node) []string { if n == nil { return links } @@ -43,8 +43,8 @@ func visit(links []string, n *html.Node) []string { //if n != nil { // links = visit(links, n.NextSibling) //} - links = visit(links, n.FirstChild) - 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 {