笔记 - go的一些常用包
公共包地址:pkg.go.dev/
- time包 (类似php中carbon)
- os包(文件操作类)
- io包(文件读取写入)
- bufio(读取文件缓冲区)
- ioutil(更方便读写文件数据)
- runtime(管理内存等分配)
- sync (锁、同步等待组等,互斥锁,同步锁)
- ini (读取ini 配置文件数据) doc
- flag (读取命令参数)
- strings (字符串操作类)
- log (日志记录)
- url (地址解析包)
- strconv (类型转换)
- regexp(正则匹配使用)
waitGroup的用法
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func main() {
wg.Add(2)
go fun1()
go fun2()
// 同步等待
wg.Wait()
fmt.Println("\n man over")
}
func fun1() {
for i := 1; i < 10; i++ {
fmt.Printf("\n函数1 %d", i)
}
wg.Done()
}
func fun2() {
for i := 1; i < 10; i++ {
fmt.Printf("\n函数2 %d", i)
}
wg.Done()
}
runtime的用法
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
fmt.Println("main start")
// go func() {
// for i := 1; i < 5; i++ {
// fmt.Println("goroutine...")
// }
// }()
// for i := 1; i < 5; i++ {
// runtime.Gosched()
// fmt.Println("main contine...")
// }
go func() {
fmt.Println("gorountine start...")
fun()
fmt.Println("goroutine end....")
}()
time.Sleep(3 * time.Second)
}
func fun() {
defer fmt.Println("defer")
// return
runtime.Goexit()
fmt.Println("fun函数")
}
互斥锁
好比几个人上厕所,优先进的人先上锁
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
var ticket = 10
var mutex sync.Mutex // 创建锁头
var wg sync.WaitGroup // 创建同步等待组对象
func main() {
wg.Add(4)
go saleTickets("售票口1")
go saleTickets("售票口2")
go saleTickets("售票口3")
go saleTickets("售票口4")
wg.Wait()
}
func saleTickets(name string) {
rand.Seed(time.Now().UnixNano())
defer wg.Done()
for {
mutex.Lock()
if ticket > 0 {
time.Sleep(time.Duration(rand.Intn(1000)) * time.Microsecond)
fmt.Println("售出:", ticket)
ticket--
} else {
mutex.Unlock()
fmt.Println("售完了")
break
}
mutex.Unlock()
}
}
读写锁
var wrMutex sync.RWMutex
持续更新中…
本作品采用《CC 协议》,转载必须注明作者和本文链接