day7函数 多返回值 错误处理

master
独孤伶俜 2022-12-05 16:05:05 +08:00
parent f9c06f7b5a
commit 69b221e562
5 changed files with 167 additions and 7 deletions

View File

@ -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

View File

@ -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)

View File

@ -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!")
}
}

View File

@ -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)
}

View File

@ -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 {