
golang
darcygail
十年生死两茫茫
展开
-
golang validator参数校验 中文
今天在改后台页面,参数校验错误时输出全是英文,使用着很难看懂到底时什么错了故而决定去做i18n前端国际化. 改的时候踩了很多坑,故而记录一下,顺便记录以下查问题的方式。效果从原来的Title is required变为标题为必填字段完成后的代码:这里主要定义了初始化了一个中文的trans和Validate的变量,并对其做初始化初始化主要做了以下事情:注册了TagName函数// ...原创 2020-04-05 20:39:37 · 2670 阅读 · 4 评论 -
golang context强制提前退出
golang中context包实现提前退出以前不知道怎么写的,一直无法退出,还以为程序就是无法提前退出。。下面的程序,request休眠100s,然后在另外一个goroutine中,3s后退出所有contextimport ( "context" "log" "sync" "time")func request() { time.Sleep(100 * time.Second...原创 2020-04-04 13:17:41 · 855 阅读 · 0 评论 -
golang 源码剖析(8): 析构SetFinalizer
SetFinalizer设置一个finalizer关联到一个对象obj,当垃圾回收准备回收obj的时候,它会断开这个连接,并在单独的goroutine中执行finalizer(obj),这将让obj再次可用,但是不会再关联finalizer,在SetFinalizer中:先检查元素,如果类型为nil,或者不为指针,元素值为nil 都会报错查找对象的heap地址如果是函数类型为nil,则移...原创 2020-03-08 20:48:10 · 540 阅读 · 0 评论 -
golang 源码剖析(7): 延迟defer
简介延迟调用(defer)的优势是:即使函数执行出错,依然能保证回收资源等操作得以执行可以在变量的定义处加入defer,代码结构上避免忘记做某些数据的回收劣势:性能上会会比直接调用慢一些如果在defer中释放,相对来说只会在函数执行结束的时候才会调用,变量生命周期会变长.定义编写以下程序, dump出汇编.defer主要调用了一下两个函数func deferprocSta...原创 2020-03-08 17:30:12 · 271 阅读 · 0 评论 -
golang 源码剖析(6): 通道
简介通道(channel) 是Go实现CSP并发模型的关键, 鼓励用通信来实现数据共享。 Dont’ communicate by sharing memory, share memory by communicating.CSP: Communicating Sequential Process创建chan.go中 hchan的结构type hchan struct { qcoun...原创 2020-03-08 02:53:01 · 266 阅读 · 0 评论 -
golang 源码剖析(5): 并发调度
概述基本流程用go func() 创建G放入P本地队列,或平衡到全局队列唤醒或新建M执行任务进入调度循环schedule获取待执行G任务并执行清理现场,重新进入调度循环PMG其实就是将cpu的控制更佳精细了,从原来的一个线程为最小单位改成了一个goroutine为单位。P: Processor, 四类与CPU核,用来控制可同时并发执行的任务数量,每个工作线程必须要绑定一个P...原创 2020-03-07 04:20:11 · 437 阅读 · 0 评论 -
golang 源码剖析(4): 垃圾回收
#基本概念三色标记和写屏障起初所有的对象都是白色扫描所有的可达对象,标记为灰色,放入待处理队列从队列中提取灰色对象,将其引用的对象标记成灰色放入队列,自身标记为黑色写屏障监视对象内存修改,重新标色或者放回队列.当完成全部的扫描和标记工作后,剩余的只有白色和黑色两种,分别代表待回收和活跃对象,清晰操作只需将白色对象内存回收即可。流程可分为以下几步:扫描a. 设置STW(s...原创 2020-03-05 19:19:50 · 658 阅读 · 0 评论 -
golang 源码剖析(3): 内存分配
基本概念## 基本策略:先从操作系统申请一块大内存,以减少系统调用将申请到的内存按照特定大小预先切成小块,构成一个链表为对象分配内存时,只需从链表中取出一个大小合适的块使用就好回收对象内存是,只需将对象放回原链表,以便服用闲置过多时,会将部分内存归还系统,降低整体开销内存块分配器将其管理的内存块分成两种:span: 有多个地址连续的页(page)组成的大块内存object...原创 2020-03-04 19:43:09 · 609 阅读 · 0 评论 -
golang 源码剖析(2) TCMalloc内存管理器
使用TCMalloc(Thread-Caching Malloc)当内存管理器以下翻译自tcmalloc.html动机相对于glibc2.3 malloc, 在2.8GHz P4上,ptmalloc2需要大概300ns执行一个malloc/free 操作,TCMalloc只需要50ns多线程时,可减少锁竞争. 小对象基本都是无锁,对于大对象,ptmalloc2也使用每个线程一个arena...原创 2020-03-04 02:58:29 · 258 阅读 · 0 评论 -
golang 源码剖析(1): 运行初始化和包初始化
初始化中主要对命令行参数整理,环境变量设置,以及内存分配器,垃圾回收器,并发调度器的工作现场准备基本概念传统并发使用的是:多线程共享内存,go 使用的是CSP(communicating sequential processes)并发模型,以通信的方式来共享内存.go 中使用GPM方式来实现CSP,每个M关联一个P,goroutine关联哪个P是无法控制的,P中维护了一个goroutin的...原创 2020-03-03 19:36:13 · 467 阅读 · 0 评论