![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go
文章平均质量分 57
~kiss~
这个作者很懒,什么都没留下…
展开
-
go的singleFlight学习
并调用 runtime.Goexit() 退出。当调用 stack := debug.Stack() 时,实际上是在获取当前程序的堆栈信息,并将其存储在一个字符串类型的变量 stack 中。当调用 runtime.Goexit() 时,当前正在执行的 goroutine 会立即终止,但不会对其他 goroutine 产生影响。这个字符串包含了程序在调用 debug.Stack() 时的调用栈信息,包括函数名、文件名和行号等。通过在适当的时候调用 runtime.Goexit(),可以实现这一点。原创 2024-06-28 23:06:20 · 573 阅读 · 0 评论 -
go~缓存设计配合singleFlight
究其原因,就是采用了go的singleFlight,假定请求缓存时长10ms,请求下游100ms,如果100ms期间来了3个流量(每隔20~50ms重试一次),那么singleFlight中请求缓存时长太短,导致它并未展现出它的威力。但是singleFlight中请求下游的做法,就可以在100ms期间,展现出singleFlight的威力。上线后分布式缓存上涨的流量并不等于下游下降的流量,而是下游下降的流量 * 2~3。一个缓存设计,配合go的singleFlight。原创 2024-06-28 21:34:02 · 232 阅读 · 0 评论 -
go的reflect实战
架构设计,有处设计,需要将string类型转为instance的实际类型,不更改业务代码的前提下,修改接口数据。因为涉及到unmarshal,因此要先判断instance中的存储的值是否已经是一个指针。解析完之后,再根据最开始是否有过包装行为,将区别返回。进行unmarshal,最终拿到实际的解析结果。如果不是,则需要包装为一个指针类型。从而实现架构上0业务代码的侵入。原创 2024-06-26 16:40:35 · 331 阅读 · 0 评论 -
go的有栈和无栈
例如,使用标准库中的 net/http 处理并发请求,默认情况下每个请求都会在一个独立的 Goroutine 中处理,每个 Goroutine 都有自己的栈。“无栈”的方式则是指一些特殊的实现,避免为每个请求分配独立的栈空间,以达到更高效的内存使用和更高的并发性能。“有栈”的方式通常是指使用传统的基于线程或协程的并发模型,每个并发请求都有自己独立的栈空间。在 Go 的 HTTP 处理中,“有栈”和“无栈”通常是指处理并发请求时的不同方式。原创 2024-06-21 22:22:10 · 312 阅读 · 0 评论 -
Go单测时的Parallel
当在测试函数中调用 t.Parallel() 后,测试框架会尝试在多个 goroutine 中并行地执行被标记的测试用例。在 Go 语言中,t.Parallel() 通常用于测试代码中,表示将当前的测试用例标记为可以并行执行。所以,如果测试用例之间存在共享的状态或资源,需要进行适当的同步或避免并行执行这些用例。这样,在运行测试时,它们可能会同时被执行,而不是按照顺序依次执行。这可以显著提高测试的执行效率,尤其是在有大量独立的测试用例时。原创 2024-06-21 21:58:24 · 254 阅读 · 0 评论 -
go 1.22 增强 http.ServerMux 路由能力
模式匹配将支持以 HTTP 方法开头,后跟空格,如 GET /demo 或 GET demo.com/ 中。/b/{bucket}/o/default 比 /b/{bucket}/o/{noun} 更精细。第一个仅匹配第四个元素是文字 “default” 的路径,而在第二个中,第四个元素可以是任何内容。如果两个模式发生冲突,而其中一个有 HOST ,另一个没有,那么有 HOST 的模式优先。例如:/b/{bucket}/o/{objectname…例如:/b_{bucket} 不是有效的通配模式。原创 2024-06-17 22:25:35 · 491 阅读 · 0 评论 -
Go 的 netpoll 如何避免洪泛攻击
在 Go 语言及其运行时环境中,背压(Backpressure)概念通常出现在高并发网络服务和消息处理系统中。背压是一种流控机制,用于调节生产者和消费者之间的速率,以防止消费者被压垮,从而保证系统的稳定性和高效性。背压机制存在于多个层级,包括应用层、网络层和系统资源层。背压机制在 Go 中主要用于协调生产者和消费者之间的速率,防止系统因负载过重而崩溃。理解和合理应用背压机制,能够构建的高并发系统更加稳定和高效。原创 2024-06-16 22:51:49 · 840 阅读 · 0 评论 -
go协程的栈
Go 协程(goroutine)的栈初始大小并不是固定的多个栈,而是有一个默认的初始大小,这个大小在不同的 Go 版本中可能会有所不同。当一个协程的栈空间不足时,Go 的运行时会自动地为这个协程扩大栈的大小,这一过程称为栈增长(stack growth)。总结来说,Go 协程的栈不是默认有多个,而是每个协程都有一个初始大小的栈,并且这个栈可以在运行时根据需要动态增长或收缩。这一机制允许协程在需要更多栈空间时能够继续运行,而不会像传统固定栈大小的语言那样遇到栈溢出的问题。go协程的栈默认有多少。原创 2024-06-16 22:13:43 · 330 阅读 · 0 评论 -
go的netpoll学习
Go的运行时(runtime)中,由调度器管理:goroutine(G)、操作系统线程(M)和逻辑处理器(P)之间的关系以实现高效的并发执行当一个goroutine(G)发起一个系统调用(system call)并且需要等待其完成时,会导致该goroutine暂停执行G的阻塞:当一个goroutine执行系统调用并因此阻塞时(例如文件I/O、网络请求等),这个goroutine会进入阻塞状态此时,它不会占用CPU资源,也不会继续执行M与P的关系调整:关键在于执行该goroutine的用户级线程(M原创 2024-06-16 22:10:19 · 1128 阅读 · 0 评论 -
网络框架netpoll中的SO_ZEROCOPY
https://www.163.com/dy/article/FS6AS7SS0518R7MO.htmlhttps://docs.kernel.org/networking/msg_zerocopy.htmlsend() with MSG_ZEROCOPYkernel v4.14 版本接受了来自 Google 工程师 Willem de Bruijn 在 TCP 网络报文的通用发送接口 send() 中实现的 zero-copy 功能用户进程就能够把用户缓冲区的数据通过零拷贝的方式经过内核空间发送到网络原创 2024-06-11 17:04:28 · 474 阅读 · 0 评论 -
网络框架netpoll~Listener的fd支持poll
扩展原生的net.listener。原创 2024-06-11 13:14:02 · 163 阅读 · 0 评论 -
Go 语言的 copy
确保源切片和目标切片的长度相同。避免源切片和目标切片指向相同的内存地址。检查 copy 函数的返回值,以确保正确处理边界情况。对于复杂类型的切片,考虑使用其他方法(如循环)进行复制。原创 2024-06-08 12:41:00 · 508 阅读 · 0 评论 -
go的Job Scheduling
概念JobJob封装(encapsulates)一个“任务task”,它由一个go函数和任意函数参数组成。该作业向调度程序提供该作业下次应计划运行的时间。Scheduler调度程序跟踪(keeps track of)所有作业,并在每个作业准备好运行时将其发送到执行程序。Executor执行器调用作业的任务并管理不同作业执行时序要求的复杂性例如单例singletons不应相互溢出(overrun each other)原创 2024-03-25 23:01:51 · 1149 阅读 · 0 评论 -
go的限流
服务请求下游,oom,排查下来发现是一个下游组件qps陡增导致但是司内网络框架比较挫,竟然不负责框架内存问题(有内存管理模块,但逻辑又是无限制使用内存)每个请求一个r、w buffer,请求无限制,内存不够直接就oom,然后就被linux给迁移掉了所以才有了加限流的必要性(粉饰太平)所以站在更高维度去考虑这个问题,就变成了一个网络框架是否要去管理内存?原创 2024-03-24 15:29:40 · 690 阅读 · 0 评论 -
go的slice学习
线上出现一粒多协程并发append全局slice的情况,导致内存不断翻倍,因此对slice的使用需要重新考虑。并发读写的情况下, 可以利用锁、channel等避免竞态。原创 2024-03-14 23:03:46 · 528 阅读 · 1 评论 -
go的singleflight学习
DoDoChanForget原创 2024-03-10 13:29:11 · 334 阅读 · 0 评论 -
go的singleflight
此时如果对每一个请求都做处理可能会浪费资源,使用 singleflight 包可以保证在同一时刻,对于相同的请求,只有一个真正的查询操作。其主要用于解决 “多个相同请求并发查询,只需要一个请求去查询,其他的等待查询结果即可” 的问题。只要 key 没有变,真正执行的操作 func 只会被执行一次。shared 是一个布尔值,表示这个结果是否被多个调用共享。在返回值中,v 和 err 是操作 func 的返回结果。比如有很多线程同时发出了相同的请求(使用了相同的键)其余的调用都会等待这一次的结果。原创 2024-03-09 22:37:19 · 281 阅读 · 0 评论 -
go的字符切片和字符串互转
string.SliceHeader和string.StringHeader经常用在 slice of byte 和 string 高效互转场景。废弃两个类型SliceHeader和StringHeader。string(bytes)或[]byte(str)官方出品必然是好东西,所以相信GO1.21即可。Slice比String多一个Cap字段。两个的数据都存储在Data数组中。原创 2023-11-19 22:25:39 · 760 阅读 · 0 评论 -
go的context.WithTimeout学习
context WithTimeout原创 2023-10-07 14:16:50 · 574 阅读 · 0 评论 -
go学习-JS的encodeURIComponent转go
还是有些许差异,如果代码中涉及转换,注意特殊字符是否会用到对于空格这种,用不到也就不用操这么多心了。原创 2023-09-20 21:51:00 · 547 阅读 · 0 评论 -
go学习-基本工具使用
gcflags=“-m=1” 指定进行逃逸分析。原创 2023-09-17 15:30:26 · 47 阅读 · 0 评论 -
go学习-基本知识点
uintptr和都是底层的操作,可用于低级别的内存控制和性能优化除了使用 Cgo 等与外部系统交互的情况外,尽量不要用unsafe包,确保程序安全稳定。原创 2023-09-17 15:27:55 · 238 阅读 · 0 评论 -
go学习-基本知识点
【代码】go学习-基本知识点。原创 2023-09-16 16:25:14 · 34 阅读 · 0 评论 -
go学习-GMP模型
G是买家,M是卖家,M根据最近的行情,动态调整,也可以去抢其他M的活G呢,买的东西也不知道是哪个M操办的,G之间是公平的。原创 2023-09-15 13:01:32 · 231 阅读 · 0 评论 -
golang内存对齐
定义结构体时可以把类型相同的字段定义放一块,同时按照占用空间从小到大(或者从大到小)的顺序定义字段。结构体内嵌套空结构体时,不要放在最后一位。定义结构体时,可以考虑把常使用的字段放在第一位。原创 2023-08-08 12:50:55 · 509 阅读 · 0 评论 -
go的context.WithTimeout运用
context.WithTimeout高级运用原创 2023-07-05 23:05:28 · 762 阅读 · 0 评论 -
go的recover的时机
recover时机原创 2023-07-05 17:07:27 · 249 阅读 · 0 评论 -
借“github.com/julienschmidt/httprouter“实践go mod
背景执行如下代码,sublime找不到 “github.com/julienschmidt/httprouter”package mainimport ( "fmt" "net/http" "log" "github.com/julienschmidt/httprouter")func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { fmt.Fprint(w, "W原创 2022-03-14 14:00:57 · 849 阅读 · 0 评论 -
go-结构体中嵌入接口
【结构体中嵌入接口】实例type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{}}type cancelCtx struct { Context mu sync.Mutex // protects原创 2021-11-07 15:55:23 · 1417 阅读 · 0 评论 -
go-结构体成员指针到结构体自身指针
指针的使用【空指针】var t *T // 空指针tmp := unsafe.Pointer(t)log.Println(tmp) // 打印 <nil>【访问 nil 指针的成员,异常】// 通过指针操作成员 t.f 和(*t).f完全等价,只能使用.运算符// invalid memory address or nil pointer dereferencelog.Println(t.f) // 错误写法// =============================原创 2021-11-07 15:12:41 · 420 阅读 · 0 评论 -
go-context详解
学习博客:https://zhuanlan.zhihu.com/p/110085652context接口type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{}}Context接口包含四个方法:Deadline返回绑定当前context的任务被取原创 2021-11-07 12:11:29 · 268 阅读 · 0 评论 -
Go中 struct{} 和 struct{}{}区别
学习博客:https://www.cnblogs.com/show58/p/12655375.htmlstruct是Go中的关键字,用于定义结构类型。type User struct { Name string Age int}struct {} :表示struct类型struct {}是一种普通数据类型,一个无元素的结构体类型,通常在没有信息存储时使用。优点是大小为0,不需要内存来存储struct {}类型的值。struct {} {}:表示struct类型的值,该值也是原创 2021-11-07 11:29:58 · 2070 阅读 · 0 评论 -
go并发控制--WaitGroup 和 Select-case
学习博客:https://www.jianshu.com/p/6232a9a32230Q:假如现在需要实现一个API,该API会执行多个 python 脚本,并根据爬取结果进行数据处理。A:比较容易想到我们需要使用go并发控制,以下是两种处理方式使用 waitGrouptasks := []taskStruct{taskA, taskB, taskC}var wg sync.WaitGroupwg.Add(len(tasks))res := []taskResult{}for i :=原创 2021-11-06 16:23:13 · 502 阅读 · 0 评论 -
go-context实例
使用channel实现各个协程的优雅关闭package mainimport "fmt"import "time"func main() { messages := make(chan int, 10) doneConsumer := make(chan bool, 1) doneProducer := make(chan bool, 1) defer close(messages) // 消费线程 go func() { ticke原创 2021-11-06 15:59:24 · 217 阅读 · 0 评论 -
select-case和time.Ticker的使用注意事项
学习播客:https://studygolang.com/articles/5224package mainimport ( "fmt" "runtime" "time")func init() { runtime.GOMAXPROCS(runtime.NumCPU())}func main() { ch := make(chan int, 1024) go func(ch chan int) { for { val := <-ch fmt.Printf(原创 2021-11-06 14:53:27 · 290 阅读 · 0 评论 -
uintptr和unsafe.Pointer的区别
学习播客:https://zhuanlan.zhihu.com/p/395234447unsafe.Pointer只是单纯的通用指针类型,用于转换不同类型的指针它不可以参与指针运算;不能读取内存存储的值,必须转换到某一类型的普通指针。uintptr用于指针运算,GC 不把 uintptr 当指针,即 uintptr 无法持有对象, uintptr 类型的目标会被回收;unsafe.Pointer 可以和 普通指针 进行相互转换;unsafe.Pointer 可以和 uintptr 进行相互转换。原创 2021-10-31 16:57:35 · 616 阅读 · 0 评论 -
go的反射
学习博客:https://studygolang.com/articles/20246反射的定义在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。即,反射就是程序在运行的时候能够“观察”并且修改自己的行为。不用反射就不能在运行时访问、检测和修改它本身的状态和行为吗?首先理解什么叫访问、检测和修改它本身状态或行为?它的本质是程序在运行期探知对象的类型信息和内存结构。不用反射能行吗?可以!汇编直接和内层打交道。但当编程迁移到高级语言之后,原创 2021-10-31 16:19:28 · 90 阅读 · 0 评论 -
go的chan
学习博客:https://www.jianshu.com/p/eba6e2af6d63https://www.runoob.com/w3cnote/go-channel-intro.htmlpackage mainimport "fmt"import "time"import "sync"import "math/rand"var m map[int]int = make(map[int]int)const ( Num = 100000)var lock sync.Mutex原创 2021-10-31 13:56:29 · 156 阅读 · 0 评论 -
go的比较
学习博客:https://www.jianshu.com/p/a982807819fagolang的变量类型:基本类型整型,包括int,uint,int8,uint8,int16,uint16,int32,uint32,int64,uint64,byte,rune,uintptr等浮点型,包括float32,float64复数类型,包括complex64,complex128字符串类型,string布尔型,bool复合类型数组struct结构体引用类型slicemap原创 2021-10-30 13:56:27 · 386 阅读 · 0 评论 -
go语言实战-1023-根据身高重建队列
【根据身高重建队列】学习博客: https://blog.csdn.net/qq_45190523/article/details/109751831假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对 (h, k) 表示,其中 h 是这个人的身高,k 是应该排在这个人前面且身高大于或等于 h 的人数。 例如:[5,2] 表示前面应该有2 个身高大于等于 5 的人,而 [5,0] 表示前面不应该存在身高大于等于 5 的人。编写一个算法,根据每个人的身高 h 重建这个队列,使之满足每个整数对 (h,原创 2021-10-23 11:43:38 · 1561 阅读 · 0 评论