go学习4

go学习4


接上一篇信道
关闭信道
语法:close(ch)ch为信道名
接收方可以用ok来检查信道是否关闭
语法:v,ok := <-ch
从关闭的信道读取到的值会是该信道类型的零值。例如,当信道是一个 int 类型的信道时,那么从关闭的信道读取的值将会是 0。
可以用for range 循环从信道 ch 接收数据,直到该信道关闭。一旦关闭了 ch,循环会自动结束。

缓冲信道
可以创建一个有缓冲(Buffer)的信道。只在缓冲已满的情况,才会阻塞向缓冲信道发送数据。同样,只有在缓冲为空的时候,才会阻塞从缓冲信道接收数据。
语法:ch := make(chan type, capacity)
capacity 指定缓冲的大小,可以理解为缓冲的容量
capacity 应该大于 0,无缓冲信道的容量默认为 0,忽略不写。
cap(ch)为ch缓冲信道的容量
len(ch)为ch缓冲信道的长度,就是当前信道中还未读取的个数

select
switch的语法类似,不同的是 select里的每个case 都是针对信道的操作。
select 语句用于在多个发送/接收信道操作中进行选择。select 语句会一直阻塞,直到发送/接收操作准备就绪。如果有多个信道操作准备完毕,select 会随机地选取其中之一执行。(PS:说白了 就是先接收的谁的就用谁的 ,后来的都不管了,可以用default防止一直阻塞

工作池(Worker PoolPools)
WaitGroup实现工作池,用来等待一批Go协程执行结束,会控制程序一直处于阻塞的状态,直到这些协程全部执行完毕。

语法:需要引入sync

package main

import (
    "fmt"
    "sync"
    "time"
)

func process(i int, wg *sync.WaitGroup) {
    fmt.Println("started", i)
    time.Sleep(2 * time.Second)//阻塞两秒
    fmt.Printf("end", i)
    wg.Done() //每执行一次,就会在计数器上减1
}

func main() {
    no := 3
    var wg sync.WaitGroup
    for i := 0; i < no; i++ {
        wg.Add(1) //每执行一次,就会在计数器上加1
        go process(i, &wg) //这里必须传入地址类型,不然主程序无法知道协程执行结束
    }
    wg.Wait()  //确保Go主协程的计数器为0,解除阻塞
    fmt.Println("All end")
}

defer

含有 defer 语句的函数或方法,会在该函数将要返回之前,调用另一个函数(ps:有点PHP析构函数的意思)
语法:defer 函数名

注意:在 Go 语言中,并非在调用defer函数的时候才确定实参,而是当执行 defer 语句的时候,就会对延迟函数的实参进行求值

defer栈
当一个函数内多次调用 defer 时,Go 会把 defer 调用放入到一个栈中,随后按照后进先出的顺序执行。

strings包

HasPrefix 判断字符串 s 是否以 prefix 开头:
方法:strings.HasPrefix(s, prefix string) bool

HasSuffix 判断字符串 s 是否以 suffix 结尾:
方法:strings.HasSuffix(s, suffix string) bool

判断字符串a 中是否包含子串b
方法:Contains(s, substr string) bool

判断字符串s是否包含字符串chars中的任一字符
方法:ContainsAny(s, chars string) bool

返回字符串s中有几个不重复的sep子串
方法:Count(s, sep string) int

子串sep在字符串s中第一次出现的位置,不存在则返回-1
方法:Index(s, sep string) int

子串sep在字符串s中最后一次出现的位置,不存在则返回-1
方法:LastIndex(s, sep string) int

字符c在s中第一次出现的位置,不存在则返回-1
方法:IndexByte(s string, c byte) int

返回将所有字母都转为对应的小写版本的拷贝
方法:ToLower(s string) string

返回将所有字母都转为对应的大写版本的拷贝
方法:ToUpper(s string) string

返回将s中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换所有old子串
方法:Replace(s, old, new string, n int) string

用去掉s中出现的sep的方式进行分割,会分割到结尾,并返回生成的所有片段组成的切片(每一个sep都会进行一次切割,即使两个sep相邻,也会进行两次切割)。如果sep为空字符,Split会将s切分成每一个unicode码值一个字符串
方法:Split(s, sep string) []string

效果同上,多了一个可以控制返回的数量n=0 返回nil,n<0 返回所有
方法:SplitN(s, sep string, n int) []string

将一系列字符串连接为一个字符串,之间用sep来分隔
方法:Join(a []string, sep string) string

删除s头部的prefix字符串。如果s不是以prefix开头,则返回原始s。
方法:TrimPrefix(s, prefix string) string

删除s尾部的suffix字符串。如果s不是以suffix结尾,则返回原始s。
方法:TrimSuffix(s, suffix string) string

time包

获取当前时间戳
time.Now().Unix()

获取当前日期
time.Now().Format("2006-01-02 15:04:05")
Format(“2006-01-02 15:04:05”)是固定写法,据说2006-01-02 15:04:05是go诞生的时间,可以根据format内的时间长短来控制返回的信息长短

时间戳转日期格式
time.Unix(1389058332,0).Format("2006-01-02 15:04:05")

日期格式转时间戳
time.Parse("2016-01-02 15:04:05","2018-08-30 17:48:00")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成长中de大神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值