golang调度器

程序启动时 创建n个操作系统线程 每个线程上面都会运行调度函数; 由于 Go 语言是协作式的调度,不会像线程那样,在时间片用完后,由 CPU 中断任务强行将其调度走。对于 Go 语言中运行时间过长的 goroutine,Go scheduler 有一个后台线程在持续监控,一旦发现 goroutine 运行超过 10 ms,会设置 goroutine 的“抢占标志位”,之后调度器会处理。但是设置标志位的时机只有在函数“序言”部分,对于没有函数调用的就没有办法了。 由于 Go 1.14 前都无法抢占...阅读全文

简书 2020-05-03 12:32:45 杜子龙

观察者模式实战

本文转自“雨夜随笔”公众号,欢迎关注。 在上一篇文章中,我们简单了讲了一下设计模式和观察者模式。那么这次让我们详细了解一下观察者模式和我们如何进行使用。 内容 还记得上一篇文章中,我们说过了解或者设计一个设计模式的时候,要按照下面四点进行分析: image.png 意图 在实际业务场景中,我们经常遇到这样的稳定,也就是在某个对象发生某种事件时,通知其他相关的对象。所以观察者模式就允许你定义一种订阅机制,使得订阅某种事件的对象能够在事件发生时得到通知。 动机 我们来分析一种常见的业务场景,也就是购...阅读全文

简书 2020-05-03 12:32:44 soolaugust

Golang动态规划

1143. 最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。 若这两个字符串没有公共子序列,则返回 0。 示例 1: 输入:text1 = "abcd...阅读全文

简书 2020-05-03 12:32:42 DoneIsBetter

2020-05-03

It's ten o'clock PM, I sleep not very well. because last night, i wake up again. it's about three o'clock. some mosquito bite me. that is hard to suffer. so i get up, spraying insecticides, and try to sleep again. i have no insecticides , i need buy ...阅读全文

简书 2020-05-03 12:32:41 蛐蛐儿阳

Golang Context 原理与实战

本文让我们一起来学习 golang Context 的使用和标准库中的Context的实现。 golang context 包 一开始只是 Google 内部使用的一个 Golang 包,在 Golang 1.7的版本中正式被引入标准库。下面开始学习。 简单介绍 在学习 context 包之前,先看几种日常开发中经常会碰到的业务场景: 业务需要对访问的数据库,RPC ,或API接口,为了防止这些依赖导致我们的服务超时,需要针对性的做超时控制。 为了详细了解服务性能,记录详细的调用链Log。 上面...阅读全文

Segmentfault 2020-05-07 08:32:34 搬砖程序员带你飞

go语言学习一

golang语言特性:1、天然并发a.从语言层面支持并发,非常简单。b.goroute,轻量级线程,创建成千上万个goroute成为可能。c.基于CSP(Communication Sequential Process 通讯序列进程)模型实现。 CSP:每个goroute之间通过管道(channel,类似linux/unix中的pipe)进行通讯,每个goroute都是独立的,是可调度的执行单位,比线程要轻量级,即协程。阅读全文

51CTO博客 2020-05-02 19:09:34 archivelog

Go语言(十七) 配置文件库项目

配置文件库项目 简介 用途: 解析ini类型的配置文件 知识点: 主要基于反射 ini配置文件的解析,配置文件如下 ;config file [server] host = www.baidu.com port = 8080 [cartdb] user = root.xxx password = root host = localhost port = 3306 database = cartdb rate = 1.2 需求分析 拆离出动态配置 映射数据到项目数据结构中-包含配置文件读取(UnM...阅读全文

51CTO博客 2020-05-02 17:17:26 wx5b285b48ed74e

Golang学习——如何判断Golang接口是否实现?

前言 在看一个底层库的的时候,看到了一个比较奇怪的写法,于是乎有了本文。 主要探讨两个问题: 1.利用编译来判断Golang接口是否实现 2.延伸出的make和new的区别 正文 1.利用new()来判断Golang接口是否实现 看了一个底层通用链接池的库,有这么一行代码: var _ Pooler = new(WeightedRoundRobin) 复制代码 需要解释的是:Pooler是一个接口类型。 type Pooler interface { // ... } 复制代码 刚开始看是疑惑的...阅读全文

掘金 2020年05月01日 相守之路

Go语言之数组与切片

数组数组简介数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。注意:和C中的数组相比,又是有一些不同的:Go中的数组是值类型,换句话说,如果你将一个数组赋值给另外一个数组,那么,实际上就是将整个数组拷贝一份如果Go中的数组作为函数的参数,那么实际传递的参数是一份数组的拷贝,...阅读全文

掘金 2020年05月01日 蓝色记忆

Go字符串初探

这篇博文的知识,主要是阅读了Go的官方博客在2013年发表的一篇,名为《Strings, bytes, runes and characters in Go》的文章,里面解释了Go语言中的string、byte以及rune类型以及Go中的编码方式等内容。 相关概念的辨析 字符串、字符、字节、位: 位bit:bit是计算机中最小的存储单位,一个bit表示一个二进制位,存储0或1。 字节byte:一个byte由8个bit组成。在Go中,byte也是一种类型,其底层实际上是一种uint8类型的别名,主...阅读全文

知识更新越来越快,但是学习起来越来越困

我是一个着迷于产品和运营的技术人,乐于跨界的终身学习者。欢迎关注我的个人公众号「跨界架构师」 每周五11:45 按时送达~ 我的第「140」篇原创敬上 ​大家好,我是Z哥,先祝大家节日快乐。不知道这个假期你打算出门吗?Z哥我是打算不出远门了,怕死,哈哈。索性好好宅家里学习,强化一下自己。相信大家也感受到了,随着互联网加速了信息的流动速度,知识的更新迭代也在加速。可能原本靠着一门手艺可以过一辈子,现在可能每5~10年就需要一次大的迭代才能跟上社会的发展步伐,不被out。并且,随着最近几年知识付费的...阅读全文

简书 2020-05-02 23:33:11 跨界架构师

golang的指针类型,unsafe.Pointer类型和uintptr类型的区别

一,区别 1,指针类型 golang支持指针类型,指针类型的变量存的是一个内存地址,这个地址指向的内存空间存的才是一个具体的值。 比如int,int32,A(自定义结构体类型),string等,都是指针类型。 golang的指针类型和c/c++的指针类型基本一样,但是多了几个限制: 1,int,int32等不同的指针类型不能相互转化. 2,指针类型不支持c/c++这样的指针运算。 2,unsafe.Pointer类型 这个类型比较重要,它是实现定位和读写的内存的基础。go runtime大量使用...阅读全文

简书 2020-05-02 23:33:10 舒小贱

Golang 中状态和结果总结

操作 通道状态 结果 Read nil 阻塞 打开且非空 读取到值 打开且空 阻塞 已关闭(Closed) <初始空值> 只能写入 编译错误 Write nil 阻塞 打开且满 阻塞 打开且非满 写入成功 已关闭(Closed) panic 只能接收 编译错误 close nil panic 打开且非空 关闭 channel,读取成功,直到通道耗尽,然后读取到默认空值 打开但空 关闭 channel, 读取到默认空值 已关闭(Closed) panic 只能接收 编译错误 close nil p...阅读全文

简书 2020-05-02 21:32:40 北冢

Go reflect 反射实例解析

Go reflect 反射实例解析 ——教坏小朋友系列 0 FBI WARNING 对于本文内容,看懂即可,完全不要求学会。 1 现象分析 网上关于golang反射的文章多如牛毛,可实际用反射的人,寥寥可数。 我分析大家不用反射的原因,大概有两点: 不会 笨重 1.1 不会 网上关于反射的文章很多,可多数都是在分析原理,并没有给出实例。而反射恰好处在一个很尴尬的点上:懂了原理不等于会用。 于是乎,大多数人高喊口号:“官方不推荐用这个库!”是的,官方不推荐用的库有两个:reflect和unsafe...阅读全文

简书 2020-05-02 19:32:39 楊浥塵

windows 下载 grpc

最近在windows 下安装grpc,趁着现在放假整体记录一下下载过程。 一.安装protoc程序 protoc下载地址,打开链接,下载对应版本(我下载的是protoc-3.11.4-win64.zip),解压后将protoc.exe拷贝至放入到GOPATH/bin目录下。 二.安装grpc 由于google.golang.org/grpc 已经迁移到https://github.com/grpc/grpc-go,所以我们需要另辟蹊径 在GOPATH/src 目录下创建google.golang...阅读全文

简书 2020-05-02 19:32:38 __默默无闻

“���”引发的线上事故

最近遇到了一起依赖升级 + 异常数据引发的线上事故,教训惨痛,本文对此进行回故和总结。 背景起因是我们使用的服务框架版本比较老,GC 次数的 metrics 打点一直为 0,咨询了相关同学后,决定升级框架。升级的过程中,出现了 use of internal package xxx not allowed 的报错,又咨询了一下相关同学后,尝试使用 go mod 解决。 从 go vendor 到 go mod 的升级的过程也不太顺利,这里按下不表,最终是升级成功了。一同升级的还有 Go 版本,从...阅读全文

深度解密Go语言之sync.pool

最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底。准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗。为了用起来更顺畅,我特地研究了一番,形成此文。本文从使用到源码解析,循序渐进,一一道来。 本文基于 Go 1.14 是什么sync.Pool 是 sync 包下的一个组件,可以作为保存临时取还对象的一个“池子”。个人觉得它的名字有一定的误导性,因为 Pool 里装的对象可以被无通知地被回收,可能 sync.Cache 是一个更合...阅读全文

qcrao 2020-04-20 00:00 qcrao

聊聊 g0

很多时候,当我们跟着源码去理解某种事物时,基本上可以认为是以时间顺序展开,这是编年体的逻辑。还有另一种逻辑,纪传体,它以人物为中心编排史事,使得读者更聚焦于某个人物。以一种新的视角,把所有的事情串连起来,令人大呼过瘾。今天我们试着以这样一种逻辑再看 g0。 回顾一下 Go 夜读第 78 期,关于调度器源码分析的内容。我们讲过,与主线程绑定的 M 对应的 g0 的主要作用是提供一个比一般 goroutine 要大的多栈(64K)供 runtime 代码执行。 初始化的过程中,在函数 runtime...阅读全文

defer 链表如何被遍历执行

去年开始写文章的第一篇就是关于 defer,名字比较文艺:《Golang 之轻松化解 defer 的温柔陷阱》,还被吐槽了。因为这篇文章,到《Go 夜读》讲了一期。不过当时纯粹是应用层面的,也还没有跳进 Go 源码这个大坑,文章看着比较清新,也没有大段的源码解析。 自从听了曹大在《Go 夜读》分享的 Go 汇编,以及研读了阿波张的 Go 调度器源码分析的文章后,各种源码、汇编满天飞…… 上次欧神写了一篇《Go GC 20 问》,全文也没有一行源码,整体读下来很畅快。今天这篇也来尝试一下这种写法,...阅读全文