随笔分类 - golang
摘要:1. Go语言中可以使用sync.WaitGroup来实现并发任务的同步 package main import ( "fmt" "sync" ) func hello(wg *sync.WaitGroup) { defer wg.Done() fmt.Println("hello") } func
阅读全文
摘要:1. 并发安全 package main import ( "fmt" "sync" ) var ( sum int wg sync.WaitGroup ) func test() { for i := 0; i < 5000000; i++ { sum += 1 } wg.Done() } fun
阅读全文
摘要:1. timer 定时器,时间到了执行,只执行一次 package main import ( "fmt" "time" ) func main() { // 1. timer基本使用 /* timer1 := time.NewTimer(2 * time.Second) t := time.Now
阅读全文
摘要:1. 概念本质上是生产者、消费者模型可以有效的控制goroutine数量,防止暴涨案例:生成一个随机数,计算该随机数每一个数字相加的和,例如:123:1+2+3=6主协程负责生产数据发送到待处理通道中去(发送的不仅仅是数据,而是包含数据的结构体指针)一个子协程负责监听结果通道,一旦有数据,取出来打印
阅读全文
摘要:1. 概念 单纯的将函数并发执行是没有意义的,函数与函数之间需要交换数据才能提现并发执行函数的意义虽然可以使用共享内存来进行数据的交换,但是在共享内存在不同的goroutine中容易发生竟态问题,为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题,go语言的并发模型是C
阅读全文
摘要:1. runtime.Gosched 让出CPU时间片,重新等待安排任务 package main import ( "fmt" "runtime" ) func main() { go func(s string) { for i :=0; i < 2; i++ { fmt.Println(s)
阅读全文
摘要:1. 概念 goroutine 奉行通过通信来共享内存,而不是共享内存来通信 goroutine 是由go的运行时(runtime)调度和管理的 go程序会智能的将goroutine中的任务合理的分配给CPU执行 go语言之所以会被称为现代化编程语言,是因为它在语言层面已经内置了调度和上下文切换的机
阅读全文
摘要:package main import ( "bytes" "fmt" "io" ) // 此处的w参数默认是一个空接口,当传递进来buf参数时,w就不是空接口了,因为它有类型了,但是动态值是一个空指针 nil func test(w io.Writer) { if w != nil { fmt.P
阅读全文
摘要:package main import ( "fmt" ) type Sayer interface { say() } type Mover interface { move() } type Animal interface { // 接口与接口嵌套创造出新的接口,Animal接口有Sayer和
阅读全文
摘要:总结: 1. 值类型的嵌入式字段,该类型拥有值类型的方法集,没有值指针类型的方法集 2. 指针类型的嵌入式字段,该类型拥有值指针类型的方法集,没有值类型的方法集,并且,该类型的指针类型也有值指针类型的方法集 有点绕,见案例: package main import "fmt" type Boss s
阅读全文
摘要:1. http server package main import ( "fmt" "net/http" ) func main() { // 请求url和对应处理函数 http.HandleFunc("/hello", myHandleFunc) // 开启服务 http.ListenAndSe
阅读全文
摘要:1. udp server package main import ( "fmt" "net" ) func main() { // udp server listenUdp, err := net.ListenUDP("udp", &net.UDPAddr{ IP: net.IPv4(127,0,
阅读全文
摘要:1. tcp server package main import ( "bufio" "fmt" "net" ) func main() { // 1. 监听端口 listener, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil
阅读全文
摘要:一、什么场景下需要用到锁当程序中就一个线程的时候,是不需要加锁的,但是通常实际的代码不会只是单线程,有可能是多个线程同时访问公共资源,所以这个时候就需要用到锁了,那么关于锁的使用场景主要涉及到哪些呢? 1. 多个线程在读相同的数据时2. 多个线程在写相同的数据时3. 同一个资源,有读又有写时 二、G
阅读全文
摘要:1. gomodules的初始化 2. 改变模块的依赖关系
阅读全文
摘要:0.1 GO module常用命令 go mod init # 初始化go.modgo mod tidy # 更新依赖文件go mod download # 下载依赖文件go mod vendor # 将依赖转移至本地的vendor文件go mod edit # 手动修改依赖文件go mod gra
阅读全文
摘要:1. 无缓冲通道 2. 有缓冲通道 有缓冲通道特点:当channel已经满,在向里面写数据就会阻塞,当channel已经为空,在从里面读数据就会阻塞。 3. 关闭channel package mainimport "fmt"func main() { c := make(chan int) go
阅读全文
摘要:goroutine与线程 /* goroutine与线程1. 可增长的栈os线程一般都有固定的栈内存,通常为2MB,一个goroutine的在其声明周期开始时只有很小的栈(2KB),goroutine的栈是不固定的,它可以按需增大或缩小,goroutine的栈大小限制可以达到1GB,虽然极少会用到这
阅读全文
摘要:package main import ( "fmt" "runtime" "time" ) func main() { // 用goroutine创建承载一个形参为空,返回值为空的一个函数 go func() { defer fmt.Println("A.defer") func() { defe
阅读全文
摘要:package main import ( "encoding/json" "fmt" "reflect" ) type Movie struct { Title string `json:"title"` Year int `json:"year"` Price int `json:"rmb"`
阅读全文