
源码分析
文章平均质量分 82
yuchenfw
公众号:Go开发笔记
展开
-
Go json tag的大小写匹配问题
你知道json tag的具体匹配规则吗原创 2022-08-29 08:00:00 · 1632 阅读 · 1 评论 -
Go test之理
Go test背后执行的原理原创 2022-06-27 08:00:00 · 791 阅读 · 0 评论 -
Go Signal信号处理机制
深入了解Go Signal信号处理机制原创 2022-03-07 08:00:00 · 1383 阅读 · 0 评论 -
Gorm TableName相关
前言使用Gorm构造模型时,通过实现Tabler interface的TableName() func可以指定table的名称。那么TableName()何时调用?操作时每次都会调用TableName()吗?TableName()支持动态表名吗?怎样实现动态表名?TableNameGorm增删改查等操作最终交由Excute执行。以Find为例:// Find find records that match given conditionsfunc (db *DB) Find(dest原创 2021-08-15 23:05:03 · 9299 阅读 · 1 评论 -
Go channel——block为false时chansend/chanrecv的处理机制
前言本篇聚集select 2个case(1个send/recv case、1个default case)场景时send、recv的具体处理。更多内容分享,欢迎关注公众号:Go开发笔记chansendselect {case c <- v: ... foodefault: ... bar}其底层对应func为selectnbsend。selectnbsend// compiler implements//// select {// case c <- v://原创 2021-05-23 13:53:30 · 461 阅读 · 0 评论 -
Go channel——block为true时chansend/chanrecv的处理机制
前言上篇文章提到channel send/recv使用形式及场景,其中 select单个send/recv case与send/recv单独使用时一致,因此本篇先从这些简单场景出发关注send、recv的具体处理。更多内容分享,欢迎关注公众号:Go开发笔记send单独使用c <- x select单个send caseselect { case c <- x :}以上两种场景send处理方式一致,底层对应func为chansend1。chansend1具体实现原创 2021-05-16 20:39:17 · 743 阅读 · 0 评论 -
Go channel——send/recv使用形式及场景
搭配select的处理逻辑你清楚吗?原创 2021-05-09 23:13:19 · 687 阅读 · 0 评论 -
Go channel——基本机制及结构
前言GO官方博客的Share Memory By Communicating中提到:Go’s concurrency primitives - goroutines and channels - provide an elegant and distinct means of structuring concurrent software. (These concepts have an interesting history that begins with C. A. R. Hoare’s Com原创 2021-04-26 21:44:23 · 502 阅读 · 1 评论 -
strconv.FormatFloat的精度处理问题
strconv.FormatFloat真的是四舍五入吗?原创 2021-01-10 17:39:05 · 14448 阅读 · 1 评论 -
为何sql.Rows使用结束后一定要Close
前言常见的sql.Rows使用方式如下:var db *sql.DB....rows, err :=db.QueryContext(ctx,selectSql,args...)...defer rows.Close()for rows.Next() { if err = rows.Scan(&dst); err != nil { return }}我们知道sql.Rows使用结束后一定要关闭。但为何要关闭?不关闭又会发生什么呢?源码会告诉我们答案。RowsRow原创 2020-11-09 22:48:05 · 3308 阅读 · 0 评论 -
了解Go编译处理(六)—— 表达式解析
Go表达式的解析原创 2020-11-01 22:05:18 · 1065 阅读 · 0 评论 -
一个json Unmarshal to slice的问题及延伸
一个json数组解析至slice的问题原创 2020-10-25 20:52:02 · 2850 阅读 · 1 评论 -
详解map(一)—— map的常用方法
前言map是语言中常用的一个数据结构,其在不同语言中有着不同的实现的,现在我们看下在go中的底层实现。更多内容分享,欢迎关注公众号:Go开发笔记map源码map的底层实现的源码位于runtime/map.go中,其相关方法的调用在编译时确认。map说明简单来说,map就是一个哈希表。数据被排列成一个bucket数组。每个bucket最多包含8个key/elem对。哈希的低位用于选择一个bucket。每个bucket包含每个hash的一些高位,以区分单个bucket中的条目。map的数据存储结构原创 2020-10-19 23:28:06 · 7059 阅读 · 0 评论 -
sync.Map详解
从源码了解sync.Map原创 2020-10-11 15:19:32 · 2090 阅读 · 0 评论 -
了解Go编译处理(五)—— 顶层声明解析
import、const、type、var的解析过程原创 2020-08-13 22:37:40 · 616 阅读 · 0 评论 -
了解Go编译处理(四)—— go文件的解析
go编译时.go文件的解析过程原创 2020-08-09 10:48:57 · 1687 阅读 · 0 评论 -
了解Go编译处理(三)—— 初识go compile
.go文件的编译过程原创 2020-08-02 10:30:47 · 2342 阅读 · 0 评论 -
了解Go编译处理(二)—— go build
从源码角度看go build的处理过程原创 2020-07-05 22:48:12 · 6257 阅读 · 0 评论 -
深入了解gorm Scan的使用
前言在使用gorm查询数据保存时,可以通过Scan快速方便地将数据存储到指定数据类型中,减少数据的手动转存及赋值过程。那么,你知道:Scan支持哪些数据类型吗?Scan如何确定接收类型的数据与查询数据之间的匹配关系的呢?我们带着这两个问题去看下相关的源码。Scan使用示例直接将查询到的数据存储到结果中。type Result struct { Name string Age int}var result Resultdb.Table("users").Selec原创 2020-07-02 23:06:10 · 27285 阅读 · 17 评论 -
了解Go编译处理(一)—— go tool
从go工具的源码了解go命令的处理过程。原创 2020-06-27 15:47:50 · 2527 阅读 · 0 评论 -
Go字符串拼接方式深入比较
从源码的角度分析Go中"+"、"fmt.Sprintf"、strings.Join三种拼接字符串的优缺点及性能问题,帮助你更好地了解、选择、使用字符串拼接。原创 2020-06-07 15:42:20 · 2387 阅读 · 0 评论 -
深入了解Go Slice(三)—— append的处理过程
从源码的角度看slice append数据的处理过程。原创 2020-06-01 22:55:08 · 2745 阅读 · 0 评论 -
深入了解Go Slice(二)—— 切片的详细处理过程
从源码的角度看Slice切片的实现过程,理解Slice后len、cap及数据的变化。原创 2020-05-25 22:24:24 · 870 阅读 · 0 评论 -
深入了解Go Slice(一)—— make的详细处理过程
关于Slice的使用有很多文章已经介绍了,本系列文章无意再重复介绍使用过程,主要专注于了解Slice后的处理逻辑,从源码的角度加深对使用的了解,解决一些常见的使用错误点。原创 2020-05-24 11:21:09 · 6649 阅读 · 0 评论 -
Base64 Encoding详解
本文主要以Go base64 package为例,详细介绍了Base64中4种Encoding的异同点及使用环境,同时对base64编/解码的详细实现过程进行了较深入的探讨。原创 2020-05-15 15:27:01 · 7022 阅读 · 0 评论 -
golang struct json tag的使用及深入理解
struct json tag主要在struct与json数据转换的过程(Marshal/Unmarshal)中使用。本文主要介绍struct json tag的使用及探寻源码中的设计处理过程。原创 2020-05-09 10:54:09 · 24462 阅读 · 0 评论 -
优雅重启Go服务——gracehttp详解
从源码的角度详细说明gracehttp实现优雅重启的原理及过程。原创 2020-04-16 23:00:06 · 3590 阅读 · 0 评论 -
zap细节拾遗——日志信息内容的具体顺序问题
前言我们在之前的篇章中主要按照几个核心使用点进行源码的分析,有些细节未能覆盖到,因此特意对使用时可能需要注意的细节,特意说明下。1.输出的日志信息内容的具体顺序问题先说结论,先后顺序为:Level-Time-LoggerName-Caller-Message-已排序的InitialFields-Stack-Fields注意:以上部分信息可缺省。(1)config build时对Ini...原创 2020-03-03 17:47:37 · 1597 阅读 · 0 评论 -
zap——SugaredLogger
SugaredLogger// A SugaredLogger wraps the base Logger functionality in a slower, but less// verbose, API. Any Logger can be converted to a SugaredLogger with its Sugar// method.//// Unlike the Lo...原创 2020-02-26 11:30:21 · 3147 阅读 · 0 评论 -
zap——Logger的设计思路
前言之前的一系列文章中主要追踪的是代码的执行逻辑和处理思路,进而熟悉代码,加深理解及使用。但是zap为什么快?它是怎么设计的?在熟悉代码后,再回头看看zap的设计思路,看看能否解答之前的一些疑惑。设计思路zap README的Performance一节中提到:For applications that log in the hot path, reflection-based serial...原创 2020-02-07 14:40:32 · 1701 阅读 · 0 评论 -
zap——logger的创建及logger的使用过程
文章目录根据Conifg创建LoggerbuildEncoderopenSinksCombineWriteSyncerslog的使用check levelWirteEncodeEntryc.out.WriteSync总结根据Conifg创建Logger// Build constructs a logger from the Config and Options.func (cfg Conf...原创 2020-01-18 15:23:19 · 3086 阅读 · 0 评论 -
zap——从Config自定义日志格式
通过自定义zap Config实现自定义日志格式原创 2020-01-12 12:17:06 · 6532 阅读 · 0 评论 -
zap——从示例开始看源码
zap是uber开发的一个基于go语言的log模块,主打就是快、结构化、日志级别。使用官方示例1.追求性能,类型要求不严格的使用SugaredLoggerlogger, _ := zap.NewProduction()defer logger.Sync() // flushes buffer, if anysugar := logger.Sugar()sugar.Infow("fai...原创 2020-01-12 11:23:24 · 1589 阅读 · 0 评论 -
深入了解Go flag
从源码中学会花式使用flag。原创 2019-12-15 17:33:36 · 1264 阅读 · 0 评论 -
golang map转json的顺序问题
我们都知道map是无序的,每次取出key/value的顺序都可能不一致,但map转json的顺序是不是也是无序的吗?尽管json中的参数顺序大部分情况下对使用没有影响,我们不妨看看源码中怎么处理的。先说结论:map转json是有序的,按照ASCII码升序排列key。溯源源码位于encoding/json/encode.go中type mapEncoder struct { ele...原创 2019-11-23 22:10:35 · 10263 阅读 · 3 评论 -
从main入口开始谈golang
一、问题1.我们知道一个可独立运行的golang程序,一定要有个main.main(),因为main()是程序的入口。可你知道为什么一定要求是main.main()吗?2.main()在执行前,根据package的初始化顺序,会先初始化依赖的package,然后初始化main,这些操作是在什么时候完成的呢?二、溯源1.源码以下代码位于go/src/runtime/proc.go,这些源码...原创 2019-11-17 12:08:44 · 2187 阅读 · 0 评论 -
从http.ListenAndServe开始看源码(二)
handler的存储及匹配前言我们在前一节的http ListenAndServe相关的源码中,我们简单提到了在HandleFunc及DefaultServeMux中完成pattern及handler的存储及匹配,具体的过程我们现在详细研究下。一、ServerMux-结构ServerMux是路由pattern及handler存储的结构,请求路由的匹配也是在此中的func中完成的。type...原创 2019-04-11 19:37:36 · 899 阅读 · 0 评论 -
beego源码分析(一)——初探
初探前言我在http.ListenAndServe相关源码简析时最后的两条总结:1.http.HandleFunc将pattern及我们自定义的handler存储在DefaultServeMux的一个map中。2.当http.ListenAndServe的handler为nil时,系统会从DefaultServeMux存储信息的map中匹配pattern获取对应的handler,进而处连接...原创 2019-04-12 20:07:57 · 2325 阅读 · 0 评论 -
beego源码分析(二)——起源
起源前言我们在初探中,从beego.run和routers package两个方向分析整个服务的框架与golang底层的框架一致。但我们还有一些疑问?实际上beego的入口只有beego.Run,怎么与routers具体联系起来的呢?接下来我们一步步看下beego.Run背后的逻辑。一、import & init我们首先从程序最开始的import部分开始看。import (...原创 2019-04-26 20:38:03 · 846 阅读 · 0 评论 -
beego源码分析(三)——了解
了解-路由及controller的处理过程在初探和起源中我们知道了基本原理、初始化及启动时的处理,本节主要探究controller的大致处理过程。一、系统路由及controller func信息的存储大致过程在初探里我们列出了各种路由的调用过程,最终均会调用p.AddToRouter。因此我们先根据其中特殊的几个了解下详细的过程。1.Get-基础路由beego.Get->BeeAp...原创 2019-04-29 19:40:01 · 963 阅读 · 0 评论