day7函数 多返回值 错误处理
parent
f9c06f7b5a
commit
69b221e562
|
@ -38,7 +38,7 @@ func main() {
|
||||||
map1["bob"] = map1["bob"] + 1
|
map1["bob"] = map1["bob"] + 1
|
||||||
fmt.Println(map1)
|
fmt.Println(map1)
|
||||||
fmt.Println(map1["qaq"]) // 0
|
fmt.Println(map1["qaq"]) // 0
|
||||||
|
print("ll")
|
||||||
// x += y, x++等简短赋值语句在map上也适用
|
// x += y, x++等简短赋值语句在map上也适用
|
||||||
map1["bob"] += 1
|
map1["bob"] += 1
|
||||||
fmt.Println(map1["bob"]) // 2
|
fmt.Println(map1["bob"]) // 2
|
||||||
|
|
|
@ -32,7 +32,6 @@ func add(t *tree, value int) *tree {
|
||||||
t.value = value
|
t.value = value
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
if value < t.value {
|
if value < t.value {
|
||||||
t.left = add(t.left, value)
|
t.left = add(t.left, value)
|
||||||
//fmt.Println("left", t.value)
|
//fmt.Println("left", t.value)
|
||||||
|
@ -43,7 +42,6 @@ func add(t *tree, value int) *tree {
|
||||||
//fmt.Println(value)
|
//fmt.Println(value)
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var nums []int = []int{4, 5, 43, 323, 45, 98, 4, 5, 7, 8, 1, 3, 2, 565}
|
var nums []int = []int{4, 5, 43, 323, 45, 98, 4, 5, 7, 8, 1, 3, 2, 565}
|
||||||
fmt.Println(nums)
|
fmt.Println(nums)
|
||||||
|
|
|
@ -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!")
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)
|
||||||
|
|
||||||
|
}
|
|
@ -18,14 +18,14 @@ func main() {
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
//fmt.Println(doc.NextSibling.Data)
|
//fmt.Println(doc.NextSibling.Data)
|
||||||
for _, link := range visit(nil, doc.FirstChild) {
|
for _, link := range Visit(nil, doc.FirstChild) {
|
||||||
fmt.Println(link)
|
fmt.Println(link)
|
||||||
}
|
}
|
||||||
//outline(nil, doc)
|
//outline(nil, doc)
|
||||||
}
|
}
|
||||||
|
|
||||||
// visit appends to links each link found in n and returns the result.
|
// 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 {
|
if n == nil {
|
||||||
return links
|
return links
|
||||||
}
|
}
|
||||||
|
@ -43,8 +43,8 @@ func visit(links []string, n *html.Node) []string {
|
||||||
//if n != nil {
|
//if n != nil {
|
||||||
// links = visit(links, n.NextSibling)
|
// links = visit(links, n.NextSibling)
|
||||||
//}
|
//}
|
||||||
links = visit(links, n.FirstChild)
|
links = Visit(links, n.FirstChild)
|
||||||
links = visit(links, n.NextSibling)
|
links = Visit(links, n.NextSibling)
|
||||||
return links
|
return links
|
||||||
}
|
}
|
||||||
func outline(stack []string, n *html.Node) []string {
|
func outline(stack []string, n *html.Node) []string {
|
||||||
|
|
Loading…
Reference in New Issue