下一个 nginx?caddy 自动 https 真香
我们通常在部署 web 服务的时候往往会选择 nginx 作为最前面的一个狠角色,它的性能和能力大家也是有目共睹的,反向代理负载均衡等等。而作为后起之秀 caddy 却不被人所熟知,不过渐渐的也开始展露头角。今天我就来介绍这个 caddy ,为什么我会称它有可能成为下一个 nginx。 我先列举几个痛点你看下: nginx 的配置文件你是否感觉有时候有点臃肿 https 需要购买或者申请证书,然后配置是否觉得麻烦? linux 下安装 nginx 需要部分依赖 而 caddy 确实给我了一种眼前一亮的感觉。 使用官网:https://caddyserver.com/ 安装https://caddyserver.com/docs/download安装很简单,直接下载对应的二进制文件即可,或者按照对应到操作系统去安装也可以。没有其他依赖。 使用https://caddyserver.com/docs/getting-started一个命令就可以启动,caddy,默认会去当前目录下寻找 Caddyfile 配置文件,也可以通过 –config 去指定文件位置 123caddy...
openfaas/faas 环境搭建和开发使用
serverless 大环境下出现了 faas,即 function as a service,函数即服务;其意思也非常好理解,就是能将一个函数作为一个服务进行使用,用户只需要编写一个函数功能即可,不需要额外去关心别的东西。https://github.com/openfaas/faas 是其中的一种实现方式。 环境准备以下环境在 mac 上进行搭建: 首先需要准备 docker 和 kubernetes 的环境,先做 k8s 的环境直接能通过 docker 桌面进行配置,已经算是很方便了。 安装步骤openfaas-cli1curl -sL https://cli.openfaas.com | sh namespace123git clone https://github.com/openfaas/faas-netescd faas-neteskubectl apply -f namespaces.yml password12345678$ cat passwd.sh # PASSWORD=$(head -c 12 /dev/urandom |...
Golang Mutex 到底是否应该使用指针
在写 go 的时候,你使用 Mutex 的时候使用的是指针还是说没有使用指针,还是随意来? 前两天我收到了下面这样的一个 PR,我突然就想到了这个问题,于是就有了这篇博客。 我一开始的想法其实我一开始的想法很简单,因为我一直没有使用指针 在我的某些印象中我曾经记得,使用锁不申明为指针是一个代码规范类似的东西 大多数的(我看过的一些)源码中,没有见过将锁申明为指针的用法 但是当时我没有办法回答这个 PR,你总不能说我是一厢情愿吧…需要一个更加合理的解释 仔细分析上网搜索一番https://www.reddit.com/r/golang/comments/6uyf16/confusion_about_mutex_and_reference/ 很多类似的问题都在问(你不用点开,只是举个例子) 问题关键sync.Mutex 这个东西不能被...
Linux 图形化监控工具
最近在分析线上问题,需要监控 Linux 相关指标,如果只是用命令,总是只能知道当前的值,无法记录过程。而设备不是云厂商的设备,所以没有相关监控,zabbix 有,但是没有相关权限可以看到。所以找到一些好用的监控小方案。 nmon安装yum install nmon 使用 总结 安装方便,使用简单,最快速度能搞定,无需过多依赖,控制台展示 当然它还有其他内存等相关信息的展示 不是特别好看(毕竟是控制台要求也不能太高),精度相对低,只能有个大概峰值 bottom安装因为是 rust 搞的,所以可能有相关依赖,需要手动处理 12345678910111213141516wget https://github.com/ClementTsang/bottom/releases/download/0.4.5/bottom_x86_64-unknown-linux-gnu.tar.gztar xvf bottom_x86_64-unknown-linux-gnu.tar.gz./btm# 如果出现以下错误需要安装 glibc # /btm: /lib64/libc.so.6:...
你的网络还好吗
之前说了 CPU、内存 、IO 在排查过程中可能出现的问题以及出现问题会影响的指标,这次就来看看在 linux 中网络的问题。 在实际中我们遇到的最多的网络问题就是:不通!!!无论是 ping 不通,物理链路不通,还是 dns 解析有问题导致的不通,还是容器间网络访问网络隔离造成的不通,等等,这个问题总是由于部署上的环境导致的。还有一类比较烦的问题就是网络带宽本来就不高的情况下,大量的请求导致网络的拥塞,最明显的感受就是接口请求超时,各种超时,nginx 超时,请求本身超时等等。对于这些问题如何进行排查呢? 诊断指标sar命令sar -n DEV 1 12345678910[root@Linkin ~]# sar -n DEV 1Linux 3.10.0-1062.9.1.el7.x86_64 (Linkin) 07/04/2020 _x86_64_ (2 CPU)03:03:40 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s03:03:41 PM...
你的 IO 还好吗
在 CPU 看来内存好慢啊,看我跑的多快;在内存看来磁盘你好慢啊,看我比你还快点;磁盘… IO 问题并非特别常见,但是因为最终要落到磁盘上,当它成为瓶颈时,往往会拖慢你的脚本,今天我们来分析下在 linux 中的 IO 问题 指标看 IO 并不只是看 IO,记住这句话,因为很多时候,IO 问题总会伴随着别的问题一起出现,而会导致误判的,从而遗漏了问题的关键。 IO 问题的指标来源于两块: 文件系统 磁盘 iowait命令top iostat %iowait 表示在一个采样周期内有百分之几的时间属于以下情况:CPU空闲、并且有仍未完成的I/O请求。 指标iowait 升高或者居高不下,可以考虑存在 IO 瓶颈或压力 rs / ws命令iostat -x -d 1 123Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilvda 0.00...
快速上手 dubbo-go
每次技术调研总会发现自己学不动了怎么办?用已有的知识来拓展要学习的新知识就好了~ by LinkinStar最近需要调研使用 dubbo,之前完全是 0 基础,对于 dubbo 只存在于听说,今天上手实战一把,告诉你如何快速用 go 上手 dubboPS:以下的学习方式适用于很多新技术 基本概念首先学习一个技术首先要看看它的整体架构和基本概念,每个技术都有着自己的名词解释和实现方式,如果文档齐全就简单很多。 http://dubbo.apache.org/zh-cn/docs/user/preface/background.html 大致浏览了背景、需求、架构之后基本上有一个大致概念 其实整体架构和很多微服务的架构都是类似的,就是有一个注册中心管理所有的服务列表,服务提供方先向注册中心注册,而消费方向注册中心请求服务列表,通过服务列表调用最终的服务。总的来说 dubbo 将整个过程封装在了里面,而作为使用者的我们来说更加关心业务实现,它帮我们做好了治理的工作。 然后我抓住了几个我想要知道的重点: 注册中心可替换,官方推荐的是...
你的内存还好吗
内存问题往往是线上环境最容易导致的问题,因为其实对于程序来说,内存总是不够用的。而大多数我们在线上遇到的问题总是一个叫 OOM 的,导致这个问题的原因也有很多,今天我们就来看看,如何在线上定位或者排查这样的问题。 诊断指标free命令free -h 1234[root@Linkin /]# free -htotal used free shared buff/cache availableMem: 7.6G 326M 6.2G 480K 1.1G 7.0GSwap: 0B 0B 0B 指标这个命令可以看到当前设备的内存总体使用情况,以及很清楚的看到交换区的内存使用情况 total:总内存 used: 已使用内存,包含共享内存 free: 未使用内存 shared: 共享内存 buff/cache 缓存和缓冲区 available 新进程可用内存 top命令top +...
Golang 监控全局变量
你是否曾经遇到过这样的情况,在开发环境排查问题,因为一些数据保存在了一些全局变量中,这些变量往往是一个 map 或者是一个数组,想看看在运行过程中,这里面究竟存放了什么数据,有时不得不在运行的时候将它输出到日志中,那么如果我想实时看到这些数据的情况又怎么办呢? 其实 golang 中已经存在这样的库,就是来做这个事情的 expvar 使用案例废话不多数,直接上案例 123456789101112131415161718192021222324252627282930313233343536373839package mainimport ( "expvar" "net/http")var ( s map[string]string user User)type User struct { Name string `json:"name"` Age int `json:"age"`}func showMap() interface{}...
你的 CPU 还好吗
最近经常在线上排查一些问题,在大多数情况下,都是代码写的业务逻辑有问题;还有一些情况是内存上导致的问题,如 OOM 或者由于数据量大导致的一些问题;但是很少会关注,但常常又会瞟一眼的,这个关注点就是 CPU。 在说到 CPU 的时候往往除了 top 看一下 CPU 使用率之外,你还会关注别的什么吗?好像也不会。 但是其实当真正出现问题的时候,很多 CPU 相关的指标都会反映出一些问题,经过之前的学习今天就来总结记录一下。 诊断指标平均负载定义系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数(单位时间内活跃进程数) 查看 uptime top 指标当平均负载高于 CPU 数量的 70% 可能就有问题了(在实际中如果你看到平均负载突然升高,也就是三个值呈现递减的趋势,就需要考虑 CPU 问题了) CPU 使用率定义除了空闲时间外的其他时间占总 CPU 时间的百分比 查看 top ps mpstat -P ALL 5 pidstat 指标这个其实不用说你就有感觉的,如果你看到你的程序占用了 30%CPU...
python 基础语法笔记
记录python的一些基础语法,用于查阅 列表和元组 列表和元组都是有序的,可以存储任意数据类型的集合 列表是动态的,长度可变,存储空间和性能略逊与元组 元组是静态的,长度大小固定,不能增加修改 创建一个列表使用 empty_list = [] 相比于 list() 更好,因为 [] 底层走的c,而 list() 是函数,更加贵 1234567891011121314151617181920l = [1, 2, 3, 4]tup = (1, 2, 3, 4)list((1, 2, 3))[1, 2, 3]l.count(3)l.index(7)l.reverse()l.sort()l.append(4)# extend会将里面的元素添加进去,而append会直接将[1,2]作为一个元素加入l.extend([1,2])tuple([1, 2, 3])(1, 2,...
Golang用300行代码实现内网穿透
我们经常会遇到一个问题,如何将本机的服务暴露到公网上,让别人也可以访问。我们知道,在家上网的时候我们有一个 IP 地址,但是这个 IP 地址并不是一个公网的 IP 地址,别人无法通过一个 IP 地址访问到你的服务,所以在例如:微信接口调试、三方对接的时候,你必须将你的服务部署到一个公网的系统中去,这样太累了。 这个时候,内网穿透就出现了,它的作用就是即使你在家的服务,也能被其人访问到。 今天让我们来用一个最简单的案例学习一下如何用 go...
将版本信息打包到go的二进制中
很多时候对于go打包后的二进制文件,我们是无法知道这个二进制是什么当前什么版本、什么时候打包的,而很多软件的命令行都会有一个 -version 的选项来打印出当前程序的版本号,当然你可以直接在程序里面写死这个版本号,但是还有更加优雅的解决方式。 实现其实很简单,只需要在 build 的时候通过 -X 参数去指定变量值就可以了 1234567891011121314package mainimport "fmt"var ( Tag = "v0.0.0" CommitID = "" Branch = "" DATE = "")func main() { fmt.Println("tag:", Tag, "branch:", Branch, "commitID:", CommitID, "DATE:",...
回首网络知识之 TCP 协议
之前我们说了 UDP 协议,也说到了 UDP 协议和 TCP 协议的对比,知道了 TCP 协议有那么一些复杂,所以这次就来仔细说说这个复杂的 TCP 前言提到 TCP 你第一想到的应该就是两个字 “靠谱”~ 因为它的所有设计都是围绕着这个任务展开的。 报文格式 很多人一看到这个就头疼了,因为格式好复杂啊,和 UDP 对比起来,怎么多了那么多东西呢? 别急,其实并不是很多,而且只要你想着为什么,你就知道会有什么。 首先是两个端口,这个和 UDP 一样,肯定需要端口,不然的话不知道是发给谁的 然后是序号和确认序号,序号是为了解决乱序的问题,如果没有序号,那么我是不知道那个先那个后,同时我还要告诉对方我收到了这个序号的信息,所以需要一个确认序号,确认的方式是告诉你我要的下一个序号是多少 首部长度也很好理解,告诉你首部有多长,你就知道前面有多长,你才知道数据从哪里开始 中间那几个标识位需要知道的是: SYN:建立连接时用的,建立连接会标识为 1 ACK:回复你建立连接,建立连接之后标识为...
Golang 之 WaitGroup 源码解析
如果我们有一个大的任务要做,我们会尝试将这个任务分解,分解完成之后并发交由 goroutine 去做,并且我需要当全部的任务完成之后再进行下面的步骤,在 sync 包下,就有这样一个东西适合上述情况,WaitGroup,今天我们来看看具体它是怎么实现的。 PS:在下面我统一用 wg 来简称 WaitGroup 使用它的使用非常简单,如下: 12345678910111213func main () { wg := sync.WaitGroup {} for i := 0; i < 10; i++ { wg.Add (1) go func (job int) { defer wg.Done () //do something fmt.Printf ("job % d done\n", job) }(i) } wg.Wait () ...
回首网络知识之 UDP 协议
最近开始在恶补网络知识,算是一个复习,在学习了很多上层建筑之后回来看看之前的基础确实又有一个新的认识。一开始准备看完之后做一个整体的总结,但是发现知识点太多所以分了几期来写,每期都会短一点,这期我们先来简单了解一下 UDP 前言传输层中重要的两个协议 UDP 和 TCP ,在平时的时候,你虽然一直用着他们,但是往往感受不到他们的存在,他们两个往往经常会在面试的时候出现,打你一个措手不及。 在学习它之前,你首先要有一个概念,为什么我们需要 UDP 或者 TCP 这样的协议,它到底是在什么时候,什么地方,帮我们完成了什么样的事情? 在网络,我们研究的往往都是如何以一种合理的方式传递数据 而且协议则指定了这样的规定,当双方都遵守这样的规定,才能看懂互相说的话,才能达到合理传递数据的目的。 UDP 怎么样 UDP 格式简单,没有花里胡哨的东西 UDP 不会先探路,而是直接就发上了 UDP 不会管你卡不卡,发给你我就不管了 报文格式 源端口号(16 位,2 字节) 目的端口(16 位,2 字节) UDP 长度(16 位,2 字节) UDP 校验和(16 位,2...
实现分布式锁,你能想到什么?
所谓分布式锁,即在多个相同服务水平扩展时,对于同一资源,能稳定保证有且只有一个服务获得该资源 — by LinkinStar 其实对于分布式锁,也是属于那种看似简单,实则有很多细节的问题。很多人在被问到这个问题的时候,一上来就会说用redis嘛,setnx嘛,我知道我知道。但仅仅是这样就能搞定了吗?那么当我们在实现一个分布式锁的时候,我们究竟需要考虑些什么呢? 必考点首先作为一个分布式锁,你一定要保证的是什么呢? 不能有两个服务同时获取到一把锁(资源) 不能出现有一个资源一直被锁住(锁一直被持有) 我认为上面两点是必须要保证的,其他的点,比如锁的获取是否高效,锁获取的非阻塞等等是评价一个锁是否好用的点(当然也不是说不重要) 下面我们一个个实现方案来说,来看看究竟有多少细节是我们需要考虑的。 redis实现先从最普遍的实现方案开始说起,redis。利用redis的特性,nx,资源不存在时才能够成功执行 set 操作,同时设置过期时间用于防止死锁 加锁SET resource_key random_value NX PX lock-time 解锁DEL...
细说kubernetes - 初识deployment
当我们认识的k8s的时候,我们第一个认识的是pod,那么我觉得第二个认识的应该就是Deployment了。作为k8s中一个非常常见的对象,今天我们来看看它的实现原理和设计思想。 PS: 本文需要你对pod的定义和理解有一定的基础 定义在k8s中,对象常常都是以一个yaml格式的文件来定义的,deployment也不例外。如果你对k8s还不是特别了解,你大可以将一个文件看做是一个对象的所有属性,每个属性都有对应的值,其实也并不复杂。deployment的定义如下: 1234567891011121314151617181920212223242526# 定义版本apiVersion: apps/v1# 定义类型kind: Deployment# 定义名称和标签metadata: name: nginx-deployment labels: app: nginx# 定义规格spec: replicas: 2 selector: matchLabels: app: nginx # 定义模板 template: metadata: ...
细说kubernetes - 为什么是pod
k8s作为现在最火的容器编排调度平台,好用我也就不必多说了。当我们初识k8s的时候一个新的概念就到了我们眼前,那就是pod。我们在使用了之后也就渐渐的接受了pod这个东西,但是你有没有想过,为什么是pod?k8s为什么会有这样的设计?今天我们就来细细说说这个pod 架构图首先我们来回忆看看k8s的架构图是什么样子的这个是来源于 https://www.kubernetes.org.cn/...
细说docker - 容器技术
docker对于现在的我们来说,已经是一个非常熟悉的东西了,docker无论是在部署打包,自动化,等方方面面都起着重要的作用,但是你是否有疑问,docker究竟是如何帮我们创建一个个隔离的环境的呢?今天我们就来看看,仔细说说docker PS:...
再看golang垃圾回收
...
快速上手kubernetes——minikube最小实现
最近在研究k8s,就来写一个关于k8s快速上手,并记录采坑的点。需要的前置知识点:docker、k8s的一些基本概念,下面这个可能对你有帮助。https://juejin.im/post/5d1b2a656fb9a07edc0b7058 什么是k8s我们知道,我们可以将项目制作成docker镜像,然后利用docker去部署我们的项目,这样可以解决很多服务器环境所带来的问题;但是容器多了,容器与容器之间就需要访问,之间就需要网络配置等等,从而就有了docker-compose;但是当我们的服务进行升级,或者服务需要进行调度,扩容等等,这个时候就需要一个大管家来管所有的东西;这个大管家就是 -...
快速上手terraform —— 阿里云OSS和ECS的创建
最近在研究terraform,采了一圈坑,记录一下。 什么是terraform?terraform 通过代码配置实现物理机等一些资源的分配。简单说就是,写一个配置文件,启动,就能帮你购买一台云的机器,或者说申请到oss的资源,或者是别的什么。具体功能见官网。 https://www.terraform.io/docs/index.html 名词解释:provider你可以把它看做各个厂商对terraform提供的插件,terraform可以调用这些插件从而实现对资源的操作管理。terraform流程:init -> plan -> apply -> destroy对应为:初始化,计划验证,实际应用,销毁 最小demo我将用一个最小的demo来演示它怎么干活的:通过terraform来创建一个阿里云的oss(以下没有利益相关)只是因为阿里云我有账号而已,其他供应商也有。 我的本地环境:macOS 步骤1...
golang中神奇的sync.Pool
在 golang 中有一个池,它特别神奇,你只要和它有个约定,你要什么它就给什么,你用完了还可以还回去,但是下次拿的时候呢,确不一定是你上次存的那个,这个池就是 sync.Pool 说实话第一次看到这个东西的时候,真的想不到这个东西有啥用啊,为什么要有这个东西呢?等我看完之后,嗯,还有有点用的;等到有一次优化经历的时候,嗯,这个有点意思了。今天我们就来看看这个神奇的 sync.Pool 简单案例首先我们来看看这个 sync.Pool 是如何使用的,其实非常的简单。它一共只有三个方法我们需要知道的:New、Put、Get 1234567891011121314151617181920package mainimport ( "fmt" "sync")var strPool = sync.Pool{ New: func() interface{} { return "test str" },}func main()...
图解golang内存分配
...
大话图解gin源码
最近在网上搜了一下,对于gin框架用的人还是比较多的,我自己之前也在使用,但是对于源码解析这块,我没有看到自己想看到的那种从框架入手的解析图,所以嘿嘿嘿,我的机会就来了,今天就带来最完整的gin源码图解。希望通过这篇博客你也能自己学会拆轮子。 PS:本文建立在你已经能熟练使用gin的基础之上,如果还没用过可以去官网看一下:https://gin-gonic.com/zh-cn/docs/然后gin是对golang的http包的封装,所以最好对http包也要有了解。 整体分析逻辑先来说明一下我整体拆解的逻辑,对于一个框架,我喜欢从下面几个方面去入手拆解: 启动方式 如何使用 实现与特点针对于gin,我也将从这几个方面去入手,就会得到下面几个问题,带着问题看源码是必备条件。首先启动的时候gin做了些什么?gin封装了什么然后怎么去实现的?gin整体结构是怎么样的,有哪些结构?… 然后使用一个比较小的demo,然后先从方法入手,进源码看。 12345678910111213141516func main() { router := gin.Default() ...
Golang的interface
由于golang中说interface的文章太多了,很多都已经说的很细节了,所以我再说感觉也有点难。于是总结出几个关键问题,供你参考,如果能做到准确无误有理有据的回答,那么interface应该是没有问题了。 问题 interface底层结构有哪两种,分别是什么样子的,里面保存了哪些信息? 其中tab是什么时候生成的? 从别的类型转换成interface,从interface转换成别的类型,这两者的过程是怎么样的? 两个interface之间是否可以比较? golang底层是如何判断一个类型是否实现了一个interface? 1、底层结构12345678910111213141516171819202122232425262728293031type eface struct { // 16 bytes on a 64bit arch _type *_type data unsafe.Pointer}type iface struct { // 16 bytes on a 64bit arch tab *itab ...
Golang之channel
go中的一个精髓就是就是channel,那么你有没有想过,它究竟是怎么实现的呢?我之前就怀疑过,是不是就是通过一个数组保存了一下传入的数据,然后在接收方读一读就完事了,那么阻塞又是怎么实现的呢?close的时候需要注意些什么呢? 结构首先我们来看一下channel的结构是怎么样的。 1234567891011121314151617181920type hchan struct { qcount uint // total data in the queue dataqsiz uint // size of the circular queue buf unsafe.Pointer // points to an array of dataqsiz elements elemsize uint16 closed uint32 elemtype *_type // element type sendx uint // send index recvx uint // receive...
你可能不知道的redis
以下是针对redis的知识点整理,用于复习,主要以罗列为主,详细具体讲解可以参考书《Redis设计与实现》,你可以过一遍看看有无知识点遗漏。个人能力有限,如果你还有补充可以再下方评论指出,万分感谢。 基础知识点 数据类型string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset...
你可能不知道的mysql
以下是针对mysql的知识点整理,用于复习,主要以罗列为主,详细具体讲解可以参考书《高性能mysql》,你可以过一遍看看有无知识点遗漏。 执行sql过程客户端 -> 连接器 -> 分析器 -> 优化器 -> 执行器 ->...
Golang的垃圾回收
最近垃圾分类的话题热度一下子就上去了,很多人因为垃圾分类的问题很头痛。因为垃圾这个话题,那我就想来说说Golang里面的垃圾,于是就有了这篇博客,golang中的垃圾回收。 现阶段网上针对golang垃圾回收的解析已经很多了,所以我也没有必要仔仔细细的一点点说,还是那个原则,用最直白的话告诉你,垃圾到底是怎么收的。 GC的意义首先本文后续都会使用 GC 代替垃圾回收这几个字。我们知道创建对象会给他分配内存资源,如果这个对象不使用了,而这个内存资源却一直被占用的话,那么我们的电脑很快就会被放满,所以需要将这些垃圾对象进行回收。 什么才是垃圾要回收,那么我们必须知道什么才是垃圾,什么不是垃圾。在我们看来,一个对象以后都不用了,就是垃圾。在程序看来,一个对象没有被引用了,就是垃圾。 GC的流程首先说明一下,下面说的停,都是STW,stop the...
不是我吹,你可能连defer都不清楚
在golang中,对于defer,我之前的理解就是和java中的finally代码块一样,没什么难度,但是吧,当我最近看的一些神奇的问题,我就发现原来并非想的那么简单。 先举个栗子123456789101112131415161718192021222324252627282930313233343536373839404142package mainimport "fmt"func main() { fmt.Println(DeferFunc1(1)) fmt.Println(DeferFunc2(1)) fmt.Println(DeferFunc3(1)) DeferFunc4()}func DeferFunc1(i int) (t int) { t = i defer func() { t += 3 }() return t}func DeferFunc2(i int) int { t := i defer...
Golang之context
当我们使用一些golang框架的时候,总能在框架中发现有个叫做context的东西。如果你之前了解过java的spring,那么你肯定也听说过其中有个牛逼的ApplicationContext。Context这个东西好像随时随地都在出现,在golang中也是非常重要的存在。今天我们就来看看这个神奇的Context。 定义 首先我们要知道什么是context? 很多人把它翻译成上下文,其实这个是一个很难描述很定义的东西,对于这种东西,我习惯用功能去定义它。我的定义是:context是用于在多个goroutines之间传递信息的媒介。官方定义:At Google, we developed a context package that makes it easy to pass request-scoped values, cancelation signals, and deadlines across API boundaries to all the goroutines involved in handling a...
Golang之reflect
反射 —— 如果你之前学过一些别的语言,比如java可能就会了解,反射是一个传说中很厉害的操作,算是一个高级用法。而同时,很多人也会告诉你,反射是一个危险的操作,那么在golang中,反射又是怎么操作的呢?今天就来说说golang中的反射reflect。 反射的定义首先问问自己,你知道什么是反射吗?如果你有一个清楚的定义,证明你已经对反射非常熟悉了。官方的定义很官方,我就说说我的:反射,反射,从字面理解就是通过镜子(或类似的东西)看到自己。而在编程中,反射指的是在运行的过程中看到自己。在实际的编程过程中我们知道,创建的这个变量或者对象是什么类型或者是什么样子的,同时很容易能对它进行操作。而在运行过程中,程序没有我们的眼睛,它并不知道这个东西是怎么样的,这个时候就需要运用到反射。通过反射我可以知道自己长什么样子。 反射的使用reflect.TypeOf如果你对反射还是有些模糊,那么看下面这个最简单的例子 1234func main() { a := 1.3 fmt.Println("a的类型是",...
Golang的strings.go源码解析 - Rabin-Karp了解一下?
strings包是我们经常在处理字符串的时候要用的,这次我们来看看它其中的一些方法具体是如何实现的。我就找到其中常用的几个方法,然后针对其中比较难的部分还有应用到一些特别算法的部分进行分析。 ToUpper先来看个简单的ToUpper,将所有字符转换成大写。这个如果让我们自己实现也没有什么难度,就是遍历每个字符转换成大写就可以。 12345678910111213141516171819202122232425262728// ToUpper returns a copy of the string s with all Unicode letters mapped to their upper case.func ToUpper(s string) string { isASCII, hasLower := true, false for i := 0; i < len(s); i++ { c := s[i] if c >= utf8.RuneSelf { isASCII =...
Golang的slice
今天来说个简单的,也不简单的东西,那就是切片。slice对于golang来说那真的是一个非常常用的东西了,很多地方都会用到它,今天就来说说,slice底层是如何实现的,又有哪些坑是需要提前注意的。 slice结构很多第一次接触golang的同学都会认为,数组和切片是差不多的东西,其实不是的,切片是数组的封装。 12345type slice struct { array unsafe.Pointer len int cap int} 上面这个就是slice的结构,顺便说一下:slice的源码位置是:go/src/runtime/slice.go 其中array是一个指针,指向底层的数组 len代表slice的长度 cap代表slice的容量 为什么会有长度和容量这个区分呢,这两个东西是用来干什么的呢?我们往下看。 slice的长度和容量我们先来看一个最简单的案例 1234sli := make([]int, 2)fmt.Printf("len=%d cap=%d\n", len(sli),...