进阶
# 进阶
Owner: -QVQ-
# 并发
# goroutine
goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的
go 函数名( 参数列表 )
# 通道(信道)
声明一个通道,用于接收线程的返回值
ch := make(chan int)
ch := make(chan int, 100)
//第二个参数用于指定缓冲池的大小
通道发送
ch <- v
// 把 v 发送到通道 ch
v := <-ch
// 从 ch 接收数据
// 并把值赋给 v
注意:默认情况下,通道是不带缓冲区的。即发送方会阻塞直到接收方从通道接收了值,
如果通道带缓冲,发送方会阻塞直到发送的值被拷贝到缓冲区内。接收方在有值可以接收之前会一直阻塞
package main
import "fmt"
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum // 把 sum 发送到通道 c
}
func main() {
s := []int{7, 2, 8, -9, 4, 0}
c := make(chan int) //管道的初始化
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
x, y := <-c, <-c // 从通道 c 中接收
fmt.Println(x, y, x+y)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Go通道遍历和关闭通道
package main
import (
"fmt"
)
func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
}
close(c)//如果不关闭,那么下面的 range 函数就不会结束,从而死锁
func main() {
c := make(chan int, 10)
go fibonacci(cap(c), c)
// range 函数遍历每个从通道接收到的数据,因为 c 在发送完 10 个
// 数据之后就关闭了通道,所以 range 函数在接收到 10 个数据之后就结束了。
for i := range c {
fmt.Println(i)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 排序
# 通用排序
package main
import (
"fmt"
"sort"
)
// 将[]string定义为MyStringList类型
type MyStringList []string
// 实现sort.Interface接口的获取元素数量方法
func (m MyStringList) Len() int {
return len(m)
}
// 实现sort.Interface接口的比较元素方法
func (m MyStringList) Less(i, j int) bool {
return m[i] < m[j]
}
// 实现sort.Interface接口的交换元素方法
func (m MyStringList) Swap(i, j int) {
m[i], m[j] = m[j], m[i]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
需要实现sort的接口,
sort.Sort(变量名)
常见的类型排序
# 字符串切片的便捷排序
sort.StringSlice(字符串)
sort.Sort()
上次更新: 2025/02/21, 14:57:10