diff --git a/blog/golang/golang-standard-errors.md b/blog/golang/golang-standard-errors.md index 49e95f5b333d6c0edc4622a3da004193de03901c..a68190abfbefd7fec1ff1b527564a82ae13e57d4 100644 --- a/blog/golang/golang-standard-errors.md +++ b/blog/golang/golang-standard-errors.md @@ -1 +1,79 @@ # Golang 标准库-errors + +errors包实现了操作错误的函数 + +error结构 + +```go +type error interface { + Error() string +} +``` + +使用示例 + +```go +package main + +import ( + "errors" + "fmt" +) + +func check(str string) (string, error) { + if str == "" { + err := errors.New("字符串不能为空") + return "", err + } else { + return str, nil + } +} + +func main() { + s, err := check("") + if err != nil { + fmt.Printf("err: %v\n", err.Error()) + } else { + fmt.Printf("s: %v\n", s) + } + // err: 字符串不能为空 +} + +``` + +自定义异常 + +```go +package main + +import ( + "fmt" + "time" +) + +type MyError struct { + When time.Time + What string +} + +func (err MyError) Error() string { + return fmt.Sprintf("%v: %v", err.When, err.What) +} + +func oops() error { + return MyError{ + time.Date(2000, 01, 02, 03, 04, 05, 0, time.UTC), + "my error", + } +} + +func main() { + err := oops() + + if err != nil { + fmt.Printf("err: %v\n", err.Error()) + } + // err: 2000-01-02 03:04:05 +0000 UTC: my error +} + +``` \ No newline at end of file diff --git a/blog/golang/golang-standard-sort.md b/blog/golang/golang-standard-sort.md new file mode 100644 index 0000000000000000000000000000000000000000..90ce0b5d067f18a9ed9b2204c46bec3042af6482 --- /dev/null +++ b/blog/golang/golang-standard-sort.md @@ -0,0 +1,299 @@ +# Golang标准库-sort + +sort包提供了切片排序 + +排序示例 + +```go +package main + +import ( + "fmt" + "sort" +) + +func main() { + s := []int{3, 4, 1, 2} + + sort.Ints(s) + + fmt.Printf("s: %v\n", s) + // s: [1 2 3 4] +} + +``` + +## 接口 + +```go +type Interface interface { + Len() int + + Less(i, j int) bool + + Swap(i, j int) +} + +``` + +## 自定义排序 + +实现接口示例 + +```go +package main + +import ( + "fmt" + "sort" +) + +type NewInts []uint + +func (n NewInts) Len() int { + return len(n) +} + +func (n NewInts) Less(i, j int) bool { + return n[i] < n[j] +} + +func (n NewInts) Swap(i, j int) { + n[i], n[j] = n[j], n[i] +} + +func main() { + s := []uint{3, 4, 1, 2} + + sort.Sort(NewInts(s)) + + fmt.Printf("s: %v\n", s) + // s: [1 2 3 4] +} + +``` + +## 浮点数切片 + +```go +package main + +import ( + "fmt" + "sort" +) + +func main() { + s := []float64{3.1, 4.2, 1.9, 2.0} + + sort.Float64s(s) + + fmt.Printf("s: %v\n", s) + // s: [1.9 2 3.1 4.2] +} + + +``` + +## 字母字符串切片 + +```go +package main + +import ( + "fmt" + "sort" +) + +func main() { + s := []string{"tom", "jack", "steve"} + + sort.Strings(s) + + fmt.Printf("s: %v\n", s) + // s: [jack steve tom] +} + +``` + +## 数字字符串切片 + +```go +package main + +import ( + "fmt" + "sort" +) + +func main() { + s := []string{"23", "12", "54"} + + sort.Strings(s) + + fmt.Printf("s: %v\n", s) + // s: [12 23 54] +} + +``` + +## 中文字符串切片 + +```go +package main + +import ( + "fmt" + "sort" +) + +func main() { + s := []string{"喔", "啊", "饿"} + + sort.Strings(s) + + fmt.Printf("s: %v\n", s) + // s: [啊 喔 饿] + + for _, v := range s { + fmt.Printf("v: %v %v\n", v, []byte(v)) + } + // 一个汉字占3个字节 + // v: 啊 [229 149 138] + // v: 喔 [229 150 148] + // v: 饿 [233 165 191] +} + +``` + +## 二维切片排序 + +```go +package main + +import ( + "fmt" + "sort" +) + +type Array [][]int + +// 实现接口 +func (array Array) Len() int { + return len(array) +} + +func (array Array) Less(i, j int) bool { + // 按照第二个值进行比较 + return array[i][1] < array[j][1] +} + +func (array Array) Swap(i, j int) { + array[i], array[j] = array[j], array[i] +} + +func main() { + s := [][]int{ + {1, 2}, + {3, 6}, + {4, 5}, + } + + sort.Sort(Array(s)) + + fmt.Printf("s: %v\n", s) + // s: [[1 2] [4 5] [3 6]] +} + +``` + +## map切片排序 + +```go +package main + +import ( + "fmt" + "sort" +) + +type MapSlice []map[string]int + +// 实现接口 +func (ml MapSlice) Len() int { + return len(ml) +} + +func (ml MapSlice) Less(i, j int) bool { + // 按照age 年龄值进行比较 + return ml[i]["age"] < ml[j]["age"] +} + +func (ml MapSlice) Swap(i, j int) { + ml[i], ml[j] = ml[j], ml[i] +} + +func main() { + s := MapSlice{ + {"money": 10, "age": 21}, + {"money": 11, "age": 20}, + {"money": 12, "age": 22}, + } + + sort.Sort(s) + + fmt.Printf("s: %v\n", s) + // s: [ + // map[age:20 money:11] + // map[age:21 money:10] + // map[age:22 money:12] + // ] +} + +``` + +## 结构体切片排序 + +```go +package main + +import ( + "fmt" + "sort" +) + +type People struct { + Name string + Age int +} + +type PeopleSlice []People + +// 实现接口 +func (s PeopleSlice) Len() int { + return len(s) +} + +func (s PeopleSlice) Less(i, j int) bool { + // 按照age 年龄值进行比较 + return s[i].Age < s[j].Age +} + +func (s PeopleSlice) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func main() { + s := PeopleSlice{ + {Name: "Tom", Age: 21}, + {Name: "Jack", Age: 20}, + {Name: "Steve", Age: 22}, + } + + sort.Sort(s) + + fmt.Printf("s: %v\n", s) + // s: [{Jack 20} {Tom 21} {Steve 22}] +} + +``` \ No newline at end of file diff --git a/blog/golang/index.md b/blog/golang/index.md index bd06282c1870290fa89d5ccb0f134c2dc8e2bfbf..6659683a0f0c14c1be04bb0aa2fe29cb90118bcf 100644 --- a/blog/golang/index.md +++ b/blog/golang/index.md @@ -58,8 +58,10 @@ - [Golang标准库-builtin](/blog/golang/golang-standard-builtin.md) - [Golang标准库-bytes](/blog/golang/golang-standard-bytes.md) - [Golang标准库-errors](/blog/golang/golang-standard-errors.md) +- [Golang标准库-sort](/blog/golang/golang-standard-sort.md) https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da -https://www.bilibili.com/video/BV1zR4y1t7Wj?p=93&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file + +https://www.bilibili.com/video/BV1zR4y1t7Wj/?p=95&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file