自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 资源 (3)
  • 收藏
  • 关注

原创 一次带宽拉满引发的百分百超时血案!

来自公众号:Gopher指北文章目录出口带宽拉满反思httptrace框架问题仍有疑虑美好愿景偈语: 未经他人苦,莫劝他人善鏖战两周有余,为了排查线上某接口百分百超时的原因,如今总算有些成果。虽然仍有疑虑但是碍于时间不允许和个人能力问题先做如下总结以备来日再战。出口带宽拉满能够发现这个问题实属侥幸。依稀记得这是一个风雨交加的夜晚,这风、这雨注定了今夜的不平凡。果然线上百分百超时的根因被发现了!我们的线上接口需要对外请求,而我们的流出带宽被拉满自然耗时就长因此导致超时。当然这都是结果,毕竟中.

2021-09-10 11:03:10 454 1

原创 惊!Go里面居然有这样精妙的小函数!

来自公众号:Gopher指北各位哥麻烦腾个道,前面是大型装逼现场。首先老许要感谢他人的认同,这是我乐此不彼的动力,同时我也需要反思。这位小姐姐还是比较委婉, 但用我们四川话来说,前一篇文章的标题是真的cuo。老许反复思考后决定哗众取宠一波,感叹号双连取名曰“惊!Go里面居然有这样精妙的小函数!”。下面就让我们来看看和标题没那么符合的一些小函数。返回a/b向上舍入最接近的整数func divRoundUp(n, a uintptr) uintptr { return (n + a - 1) .

2021-08-08 22:45:17 190

原创 讲的是切片,但好像又不只是切片?

来自公众号:Gopher指北文章目录切片底层结构切片和结构体的互转unsafe题外话创建切片简单的切片表达式完整的切片表达式切片扩容扩容逻辑计算内存容量我内心一直有一个欲望,想要高声呼喊“我胡汉三又回来了”,而现在就是合适的时机。正式开干之前有点手生,太久没有写技术类的文章,总有点怠惰,不得不说坚持确实是一件很难的事情。如果不是因为愧疚和写点东西能让自己稍微平静下来一些,我可能还将继续怠惰下去。另外还有一件很有意思的事情分享一下。前一篇在公众号上的文章仅思考就花了近一个月,写只花了一天,而技术文.

2021-07-29 22:36:09 258

原创 有趣!一行代码居然无法获取请求的完整URL

来自公众号:Gopher指北文章目录缘起HTTP1.1中为什么无法获取完整的连接请求资源origin-formabsolute-formauthority-formasterisk-formHTTP2中为什么无法获取完整的连接缘起做Web服务的时候,可能会有这样一个业务场景,获取一个HTTP请求的完整URL。很巧,老许就碰到了这样的业务场景。面对如此简单的需求,CV大法根本没有展示才能的机会。啪啪啪,获取请求的完整URL代码就出来了。当时离验证只差一步,老许信心满满,很快,打脸来得很快就像龙卷.

2021-03-31 11:06:33 520 1

原创 白话Go内存模型&Happen-Before

来自公众号:Gopher指北文章目录Happens Beforehappens-before的作用什么是Happens BeforeGo中的同步Go的初始化goroutine的创建结束Channel的发送和接收LockOnce不正确的同步Go内存模型明确指出,一个goroutine如何才能观察到其他goroutine对同一变量的写操作。当多个goroutine并发同时存取同一个数据时必须把并发的存取操作序列化。在Go中保证读写的序列化可以通过channel通信或者其他同步原语(例如sync包中的互.

2021-03-04 19:02:56 403 1

翻译 1分钟内的Linux性能分析法

来自公众号:新世界杂货铺文章目录总结uptimedmesg | tailvmstat 1mpstat -P ALL 1pidstat 1iostat -xz 1free -msar -n DEV 1sar -n TCP,ETCP 1top本着“拿来主义”的精神,吸收他人长处为己用。老许翻译一篇Linux性能分析相关的文章分享给各位读者,同时也加深自己的印象。你登录到具有性能问题的Linux服务器时,第一分钟要检查什么?在Netflix,我们拥有庞大的Linux EC2云实例,以及大量的性能分.

2021-02-10 10:49:37 200

原创 Go中的SSRF攻防战

来自公众号:新世界杂货铺文章目录写在最前面什么是SSRF回合一:千变万化的内网地址回合二:URL跳转回合三:DNS Rebinding个人经验写在最前面“年年岁岁花相似,岁岁年年人不同”,没有什么是永恒的,很多东西都将成为过去式。比如,我以前在文章中自称“笔者”,细细想来这个称呼还是有一定的距离感,经过一番深思熟虑后,我打算将文章中的自称改为“老许”。关于自称,老许就不扯太远了,下面还是回到本篇的主旨。什么是SSRFSSRF英文全拼为Server Side Request Forgery,翻.

2021-01-20 23:18:49 542

原创 2020总结:稍微努力了一下,依旧是咸鱼一条

2020最深刻的印记是新冠疫情,于笔者最深刻的印记是在这一年下定决心做了一些新的尝试。既然有了新的尝试,笔者也就随大流来一发年终总结。关于“新世界杂货铺”这个名字2020的年终总结,最想谈的就是新世界杂货铺这个名字。为什么想先谈名字呢?因为笔者最近正在思考要不要换个名字,毕竟这个名字和公众号的内容实在没什么直接联系。笔者一度怀疑就是因为这个名字才导致笔者的粉丝增长缓慢。先说一说为什么叫这个名字吧。专注于技术分享但是又不止于技术分享故谓之“杂货铺”,比如笔者曾经深夜偷偷发了一篇“7年,爷青结,感谢春物的

2020-12-31 10:21:18 177

原创 int切片和string切片为什么不能转为interface类型的切片

来自公众号:新世界杂货铺在给可变参数传参时, 笔者经常会犯一些低级错误。如:cannot use (type []string) as type []interface {}和cannot use (type []int) as type []interface {}等。所以, 特地写下这篇文章用来时时刻刻地提醒自己。Q1: 可以将[]T转为[]interface{}类型嘛?答:不能直接转,Go语言规范不允许这样做,因为两种类型在内存中没有相同的表现形式。有必要将元素单独复制到目标切片。下面的例.

2020-12-29 11:03:15 983 3

翻译 灵魂一问:数据库连接池到底该怎么配?

来自公众号:新世界杂货铺文章目录1万并发用户访问But why?有限的资源计算公式公理:你需要一个小的充满了等待连接的线程队列避免死锁的连接池大小忠告好家伙,我直接好家伙!GitHub不愧是全球最大的同性交友网站,资源丰富且质量高!连接池的配置应该按照什么原则来?这个问题在笔者心中疑惑良久,直到在GitHub上发现了About Pool Sizing这篇文章。看完之后一扫笔者心中阴霾,神清气爽。妈妈再也不用担心我在项目中瞎配连接池啦!以下内容为笔者根据原文翻译总结所得。原文提到开发人员经常.

2020-12-24 12:45:06 200

原创 码了2000多行代码就是为了讲清楚TLS握手流程(续)

来自公众号:新世界杂货铺文章目录结论先行单向认证双向认证总结和TLS1.3的比较消息格式的变化消息类型的变化消息加密的变化生成密钥过程TLS1.1和TLS1.0不支持HTTP2写在最后在“码了2000多行代码就是为了讲清楚TLS握手流程”这一篇文章的最后挖了一个坑,今天这篇文章就是为了填坑而来,因此本篇主要分析TLS1.2的握手流程。在写前一篇文章时,笔者的Demo只支持解析TLS1.3握手流程中发送的消息,写本篇时,笔者的Demo已经可以解析TLS1.x握手流程中的消息,有兴趣的读者请至文末获取.

2020-12-16 10:59:07 311

原创 区分Protobuf 3中缺失值和默认值

来自公众号:新世界杂货铺文章目录增加标识字段字段含义和默认值区分使用oneof使用wrapper类型允许proto3使用`optional`标签proto2和proto3结合使用这两天翻了翻以前的项目,发现不同项目中关于Protobuf 3缺失值和默认值的区分居然有好几种实现。今天笔者冷饭新炒,结合项目中的实现以及切身经验共总结出如下六种方案。增加标识字段众所周知,在Go中数字类型的默认值为0(这里仅以数字类型举例),这在某些场景下往往会引起一定的歧义。以is_show字段为例,如果没有该字.

2020-12-11 13:01:52 3523

原创 线上数据被回滚两次我都做了哪些不正确的操作

PM是需求的生产者,程序猿是需求的消费者,这二者就是典型的生产者与消费者模型。因此本次事故的根因还是PM提出了需求,故笔者认为只要PM不再提需求就不再有事故。

2020-12-07 22:16:12 206

原创 码了2000多行代码就是为了讲清楚TLS握手流程

来自公众号:新世界杂货铺文章目录前言结论先行HTTPS单向认证HTTPS双向认证总结Client发送HelloMsgServer读HelloMsg&发送消息处理clientHelloMsg选择合适的证书以及签名算法计算握手阶段的密钥以及发送Server的参数发送Server证书以及签名发送finishedMsg并再次计算密钥Client读消息&发送消息读取serverHelloMsg并计算密钥处理Server发送的参数验证证书和签名处理finishedMsg并再次计算密钥Client发.

2020-11-28 18:01:10 638

原创 一个隐藏在方法集和方法调用中且易被忽略的小细节

来自公众号:新世界杂货铺文章目录方法集方法调用你以为你都懂了彩蛋作为一个长期从事Go语言开发的程序猿,笔者不敢说自己是老油条但也勉强算一个小油条。然而就在今天,笔者研究TLS/SSL握手源码的时候,突然灵光一闪,想到了一个和自己认知不符的现象,于是赶紧写了一个例子验证一番,结果当头一棒直到码这篇文章时依旧懵逼。话不多说,上锤!不好意思,不是这个锤,是下面这个:type set interface { set1(s string) set2(s string)}type test st.

2020-11-23 15:15:05 853 5

原创 HTTP2服务器推送的第一次尝试

来在公众号:新世界杂货铺在HTTP1.x中,访问一个页面,浏览器首先获取HTML资源,然后在解析页面时增量地获取其他资源,服务器必须等待浏览器发出请求后才下发页面内资源。而服务器实际上是知道页面内资源有哪些的,如果服务器能够在浏览器显式请求资源之前就将资源推送到浏览器,页面加载速度将会大大提示,这也是本篇的主旨。本篇主要分为两个部分,第一部分是用go实现的服务器推送例子,第二部分是自签名证书。为什么会有自签名证书,这里笔者先卖个关子,继续阅读后文将会守得云开见月明。服务器推送例子目前仅有HTTP.

2020-11-17 09:51:52 298

原创 又一道比较运算符相关的面试题让我明白基础很重要

来自公众号:新世界杂货铺文章目录比较运算不简单啊类型声明underlying type类型相同类型可赋值分析总结比较运算不简单啊我们先看一下上一期的投票结果:首先,笔者自己选择了true,所以实际结果是41%的读者都选择了错误的答案。看到这个结果,笔者相信上一篇文章还是能够帮助到大家。经过千辛万苦终于明白了上一道面试题是咋回事儿,这个时候却见面试官微微一笑道:“下面的输出结果是什么”。type blankSt struct { a int _ string}bst1 := blan.

2020-11-09 19:02:02 188

原创 一道比较运算符相关的面试题把我虐的体无完肤

来自公众号:新世界杂货铺文章目录杂(货铺)谈杂(货铺)言基本定理常见类型的比较不可比较的类型复数之间的比较结构体之间的比较指针之间的比较Channel之间的比较Interface{}之间比较非接口类型X实现了接口T,则X的变量x能和T的变量t进行比较数组之间的比较杂(货铺)谈今天这篇文章相对来说比较基础,大家花几分钟时间看看,有所收获自然是最好,没有收获也就消磨几分钟时间罢了,你不亏,笔者也不亏~前几期还是有一定难度的HTTP系列文章,今天却是画风突变讲起了基础,这当然是因为基础重要呀。正所谓万.

2020-11-06 17:33:18 698 5

原创 Go发起HTTP2.0请求流程分析(后篇)——标头压缩

在一个连接上,client和server维护一个相同的HPACK索引列表,多个请求在发送和接收Header数据时可以分为两种情况

2020-10-26 10:38:39 554

原创 Go发起HTTP2.0请求流程分析(中篇)——数据帧&流控制

本篇主要分为三个部分:数据帧,流控制器以及通过分析源码逐步了解流控制。本有意将这三个部分拆成三篇文章,但它们之间又有联系,所以最后依旧决定放在一篇文章里面。由于内容较多,笔者认为分三次分别阅读三个部分较佳。

2020-10-19 10:01:39 447

原创 Go发起HTTP2.0请求流程分析(前篇)

继Go中的HTTP请求之——HTTP1.1请求流程分析之后,中间断断续续,历时近一月,终于才敢开始码字写下本文。HTTP2.0在建立TCP连接和安全的TLS传输通道与HTTP1.1的流程基本一致。所以笔者建议没有看过Go中的HTTP请求之——HTTP1.1请求流程分析这篇文章的先去补一下课,本文会基于前一篇文章仅介绍和HTTP2.0相关的逻辑。

2020-10-12 10:31:22 1546

原创 深入剖析go中字符串的编码问题——特殊字符的string怎么转byte?

来自公众号:新世界杂货铺文章目录前言问题unicode和utf-8的恩怨纠葛go中的字符go中的字符串是utf8编码的go中的rune理解go中的字符串其实是字节切片字符串的多种表示方式前言前段时间发表了Go中的HTTP请求之——HTTP1.1请求流程分析,所以这两天本来打算研究HTTP2.0的请求源码,结果发现太复杂就跑去逛知乎了,然后就发现了一个非常有意思的提问“golang 特殊字符的string怎么转成[]byte?”。为了转换一下心情, 便有了此篇文章。问题原问题我就不码字了,直接上.

2020-10-08 10:28:20 1871

原创 为什么go中的receiver name不推荐使用this或者self

来自公众号:新世界杂货铺文章目录前言CR标准做法Receiver是方法的第一个参数!Receiver是可以为nil的!!!前言在日常的开发中我们除了定义函数以外, 我们还会定义一些方法。这本来没有什么, 但是一些从PHP或者其他面向对象语言转GO的同学往往会把receiver name命名为this, self, me等。笔者在实际项目开发中也遇到类似的同学, 屡次提醒却没有效果,于是决心写下这篇文章以便好好说服这些同学。CR标准做法首先我们来看一下GO推荐的标准命名Receiver Nam.

2020-10-02 21:25:43 1002 2

原创 for-range造就循环永动机?快来看看go中for-range的那些事!

来自公众号:新世界杂货铺文章目录循环永动机神奇的指针map的随机遍历参考循环永动机Q1: 如果我们在遍历数组的同时修改数组元素,能否得到一个永远都不会停止的循环呢?func main() { arr := []int{1, 2, 3} for _, v := range arr { arr = append(arr, v) } fmt.Println(arr)}// 输出: 1 2 3 1 2 3上述代码的输出意味着循环只遍历了原始切片中的三个元素,我们遍历切片时追加的.

2020-09-28 15:20:27 401

原创 Go中的HTTP请求之——HTTP1.1请求流程分析

http是目前应用最为广泛, 也是程序员接触最多的协议之一。今天笔者站在GoPher的角度对http1.1的请求流程进行全面的分析。希望读者读完此文后, 能够有以下几个收获:1. 对http1.1的请求流程有一个大概的了解2. 在平时的开发中能够更好地重用底层TCP连接3. 对http1.1的线头阻塞能有一个更清楚的认识

2020-09-25 13:13:44 1042

原创 go runtime debug 小技巧

文章目录前言dlv命令行debugvscode图形化debugdebug不出现在call stack的函数前言本意是打算研究一下go程序的启动流程,然后就去网上搜索了一下入门教程。结果令我有点沮丧,搜到的几乎所有文章开篇都是通过GDB调试, 然后就是不同平台下的汇编代码。。。这令我很不开心, 虽然C/C++应用很广泛, 但是我对它真的没啥兴趣啊, 对它相关的调试工具就更加不感冒了, 虽然它可以调试go程序, 但是总感觉心里少了点什么, 难道dlv它不香嘛, 于是就有了今天这篇文章dlv命令行debu

2020-09-20 10:40:11 417

原创 我擦~字符串转字节切片后,切片的容量竟然千奇百怪

文章目录神奇的现象现象一现象二现象三现象四现象五分析字符串变量转切片字符串直接转切片结论扩展参考神奇的现象切片, 切片, 又是切片!前一篇文章讲的是切片, 今天遇到的神奇问题还是和切片有关, 具体怎么个神奇法, 我们来看看下面几个现象现象一a := "abc"bs := []byte(a)fmt.Println(bs, len(bs), cap(bs))// 输出: [97 98 99] 3 8现象二a := "abc"bs := []byte(a)fmt.Println(len(

2020-09-17 10:19:57 384

原创 切片真的是引用类型嘛

文章目录灵魂三问灵魂三问引发的思考append的分析结论补充参考注: 以下仅代表个人看法, 如果和大部分文章内容不一致,还请酌情参考灵魂三问Q1. 引用和指针的区别是什么?答: 其实他们的区别我也说不清楚, 但是他们都有一个共同点, 那就是他们能够指向真实的值, 操作他们会改变真实的值Q2. 在go中有指针了我们为什么还要有提出引用的概念?答:很明显这个问题我答不上来, 说实话我也只是看很多文章里面这么说, 我自己没有去认真研究过Q3. go中真的有引用这个概念嘛?答: 这个问题或许可以解

2020-09-14 09:33:57 463

原创 Android 系统启动过程简略分析

摘要:Android系统启动的过程可概括为init进程启动、Native服务启动、SystemServer,Android服务启动和Home启动4个步骤。各个步骤紧密联系一环紧扣一环,是一个统一的整体。关键字:init进程;Zygote进程;SystemServer1 Android OS架构Android 系统采用了分层架构,分为4个层次,从高层到底层分别是应用程序层、应用层许框架层

2014-11-11 21:54:38 993

基于Android的二维码/条形码开源项目

近些年来二维码因为存储的字节数多而被广泛应用于各种用途和信息传递,相信你也会想尝试一下这方面的编程,这儿有一个开源的项目及相关的依赖包可以让你轻松愉快的上手二维码编程。

2014-09-09

蓝桥杯题目及方案

2013年蓝桥杯预赛真题,本科Java组必备资料

2014-08-13

sqlite3.exe——好用的轻型数据库

一款好用的轻型数据库,目前大部分Android,java开发均可用的数据库,可以满足大部分需求

2014-08-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除