自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

面向对象的笔记

不是博客! 是笔记

  • 博客(103)
  • 资源 (2)
  • 问答 (1)
  • 收藏
  • 关注

原创 Go 程序的启动流程【1/2】

相对而言 ARM 初始化 TLS 的过程是比较简单的,总体就做了一件事:为。

2024-04-06 18:50:48 1091

翻译 更新 Go 内存模型

Go 在其内存模型中保持保守的总体方法对我们很有帮助,应该继续下去。然而,有一些更改是早就应该做的,包括在 sync 和 sync/atomic 包中定义新 API 的同步行为。atomic 尤其应该被记录下来,以提供顺序一致的行为,从而创建 happened-before 关系来同步它们周围的非原子代码。这将与所有其他现代系统语言提供的默认原子相匹配。也许更新最独特的部分是明确声明,具有数据竞争的程序可能会被停止以报告竞争,但除此之外,程序具有定义良好的语义。

2024-04-06 18:45:24 14

原创 提高命令行效率的神器 —— jalias

在终端中频繁切换目录是每个开发者的日常,但是每次都要输入完整的路径实在让人头疼。今天,我要向大家介绍一个强大的命令行工具 —— jalias,它可以极大地提高你在命令行中的工作效率。

2024-04-06 18:40:12 521

原创 Go json 差异比较 json-diff(RFC6902)

Go json 差异比较 json-diff(RFC 6092)思路根据 JSON 的特点,可以将 JSON 分为 object, slice, value 三种类型,object 对应 "a":{}, slice 对应 [], value 类型对应 1, 如一个 JSON 如下:{ "a": [1]}就可以看作一个 object 类型的 a, 值为一个 slice 类型, slice 类型中又包含一个 value 类型,由此可以把一个 JSON 对象转换为一颗树,DFS 对比两颗树,就

2023-12-11 23:00:30 2025

原创 Go map 大小

go 中如何获取一个 map 占用的内存大小呢?

2023-12-11 22:38:43 837 1

翻译 【译】TcMalloc: Thread-Caching Malloc

TcMalloc 的核心是分层缓存,前端没有锁竞争,可以快速分配和释放较小的内存对象(一般是 256 KB)前端有两种实现,分别是 pre-CPU 和 pre-Thread 模式,前者申请一块大的连续内存,每一个逻辑 CPU 将获得其中的一段。这种模式下 TcMalloc 通过保存额外的元数据来动态地调整每种大小类的实际缓存大小。Per-Thread 模式为每个线程分配一个本地缓存,线程缓存中每种大小类的可用对象通过链表连接。

2022-11-06 23:11:02 519 1

原创 【Go】Map 的空间利用率统计

今天刷 B 站看见有 Up 主在讲布隆过滤器,提到了利用率的问题,假设有一组数据,范围分布非常广,使用布隆过滤器时如何尽量少的减少内存使用,感觉除了针对特定数据的定向优化外没什么特别好的办法,类似于 Google 那种加数据头以跳过大段间隙那样。然后想到类似的问题应该广泛存在于所有使用哈希表的数据结构中,那 go 中 map 的利用率如何呢?

2022-05-04 23:09:57 1560

翻译 硬件内存模型 Hardware Memory Models

很久以前,当人们还在写单线程程序的时候,让程序跑的更快的一个最有效的办法就是什么也不做,因为下一代硬件和编译器的优化会使得程序更快但行为不发生改变。但是多年前的某一天,硬件工程师们发现让单个处理器越来越快的魔法消失了,与此同时,他们发现了一种新的魔法……

2022-01-28 23:43:06 862

翻译 [译] Bounds Check Elimination 边界检查消除

Go 是一种内存安全的语言,在针对数组 (array) 或 Slice 做索引和切片操作时,Go 的运行时(runtime)会检查所涉及的索引是否超出范围。如果索引超出范围,将产生一个 Panic,以防止无效索引造成的伤害。这就是边界检查(BCE)。边界检查使我们的代码能够安全地运行,但也会影响一定的性能。

2022-01-06 23:49:57 225

原创 Python3.10 结构化模式匹配 PEP 634

Python3.10 结构化模式匹配 PEP 634眼看 2021 马上结束,python 发布了它的 3.10 版本,优化了错误消息,上下文管理器等内容,但更吸引我的还是结构化模式匹配。众所周之 switch 一直是 python 社区呼声比较高的一个功能,这次发布的结构化模式匹配 match 在功能上应该比 Java 或 C 中的这种 switch 强大一点。match 的语法类似于其他语言的 switch:def demo(code: int) -> str: match co

2021-12-28 23:03:08 357

原创 Go 1.18.1 Beta 尝鲜 泛型 FuzzTest workspace mode

go1.18 beta 终于发布了,快来看看泛型,模糊测试,workspace mode 这些期待已久的功能把

2021-12-16 00:33:02 922

原创 MySQL InnoDB 是如何存储数据的

InnoDB 是怎么存储数据的本文是《MySQL 是怎样运行的 —— 从根儿上理解 MySQL》读书总结,强烈推荐这本书;由于我实在太菜了,错误在所难免,后面如果我发现错误会在 我的博客 上更正。数据目录众所周之,MySQL 的数据是存储在硬盘中的,而操作系统管理硬盘中的数据的方式就是文件系统,所以通俗的来说,MySQL 中的数据是存在一个个文件中的,这些文件 的目录就叫 数据目录。通过 SHOW VARIABLES LIKE 'datadir' 可以查看这个目录:进入这个目录,你会发现

2021-02-28 00:11:09 1350

原创 关于 HTTP 的一切(HTTP/1.1,HTTP/2,HTTP/3,HTTPS, CORS, 缓存 ,无状态)

HTTP为什么会出现 HTTP 协议,从 HTTP1.0 到 HTTP3 经历了什么?HTTPS 又是怎么回事?HTTP 是一种用于获取类似于 HTML 这样的资源的 应用层通信协议, 他是万维网的基础,是一种 CS 架构的协议,通常来说,HTTP 协议一般由浏览器等 “客户端” 发起,发起的这个请求被称为 Request, 服务端接受到客户端的请求后,会返回给客户端所请求的资源,这一过程被称为 Response,在大部分情况下,客户端和服务器之间还可能存在许多 proxies,他们的作用可能各不相同

2021-02-20 22:02:29 1698

原创 Golang 定时任务 github/robfig/cron/v3 使用与源码解析

Cron 源码阅读robfig/cron/v3 是一个 Golang 的定时任务库,支持 cron 表达式。Cron 的源码真实教科书级别的存在(可能是我菜 …),真的把低耦合高内聚体现地淋漓尽致,另外其中涉及的装饰器模式,并发处理等都很值得学习。使用 cron 可以很方便的实现一个定时任务,如下:go get github.com/robfig/cron/[email protected] mainimport "github.com/robfig/cron/v3"c := cron.N

2021-02-18 21:23:08 19983 6

原创 【数据库】一篇文章搞懂数据库隔离级别那些事(LBCC,MVCC)

MySQL 事务文章比较长,建议分段阅读后续如果有改动会在 Junebao.top之前对事务的了解仅限于知道要么全部执行,要么全部不执行,能背出 ACID 和隔离级别,知其然但不知其所以然,现在觉得非常有必要系统学一下,关于事务,关于 LBCC,关于 MVCC,关于死锁 ……并发的问题所谓 事务 是用户定义的一个 数据库操作序列, 这些操作要么全做,要么全不做,是一个不可分割的工作单位,在关系型数据库中,一个事务可以是一条 SQL 语句,一组 SQL 语句或者是整个程序,事务的开始和结束由用

2020-12-22 17:31:53 789

原创 【Go】sync.RWMutex源码分析

RWMutex读写锁相较于互斥锁有更低的粒度,它允许并发读,因此在读操作明显多于写操作的场景下能减少锁竞争的次数,提高程序效率。type RWMutex struct { w Mutex // held if there are pending writers writerSem uint32 // semaphore for writers to wait for completing readers readerSem uint32 // semaphore fo

2020-11-25 15:53:23 184

原创 【Go】sync.WaitGroup 源码分析

WaitGroupsync.WaitGroup 用于等待一组 goroutine 返回,如:var wg = sync.WaitGroup{}func do() { time.Sleep(time.Second) fmt.Println("done") wg.Done()}func main() { go do() go do() wg.Add(2) wg.Wait() fmt.Println("main done")}概览

2020-11-25 15:52:06 178

原创 【Golang 源码】sync.Map 源码详解

sync.Map不安全的 mapgo 中原生的 map 不是并发安全的,多个 goroutine 并发地去操作一个 map 会抛出一个 panicpackage mainimport "fmt"func main() { m := map[string]int { "1": 1, "2": 2, } // 并发写 for i := 0; i < 100; i ++ { go func(i int) { m

2020-11-11 16:51:45 351

原创 【Go 并发控制】上下文 context 源码

Context在 Go 服务中,往往由一个独立的 goroutine 去处理一次请求,但在这个 goroutine 中,可能会开启别的 goroutine 去执行一些具体的事务,如数据库,RPC 等,同时,这一组 goroutine 可能还需要共同访问一些特殊的值,如用户 token, 请求过期时间等,当一个请求超时后,我们希望与此请求有关的所有 goroutine 都能快速退出,以回收系统资源。context 包由谷歌开源,在 Go 1.7 时加入标准库,使用它可以很容易的把特定的值,取消信号, 截止

2020-11-01 17:49:07 177

原创 MySQL 为什么用索引,为什么是 B+树,怎么用索引

MySQL 索引A database index is a data structure that improves the speed of operations in a table. Indexes can be created using one or more columns, providing the basis for both rapid random lookups and efficient ordering of access to records.为什么需要索引根据上面索引

2020-10-15 17:18:12 327 2

原创 【Go】panic: reflect: call of reflect.Value.FieldByName on ptr Value

产生原因调用 FieldByName()方法时,调用者与预期类型不相符。// 错误代码func setNewArticleInfoToCache(article *Article) { fields := []string{ "Title", "Abstract", "ID", "AuthorID", "CreateTime", } immutable := reflect.ValueOf(article) // immutable := reflect.ValueOf(article).

2020-09-22 09:37:34 10262

原创 【设计模式 06】原型模式(克隆??)

原型模式(clone?)Prototype pattern refers to creating duplicate object while keeping performance in mind. This type of design pattern comes under creational pattern as this pattern provides one of the best ways to create an object.参考:tutorialspoint | proto

2020-06-28 00:47:18 173

原创 【设计模式 05】工厂方法模式

工厂方法模式define an interface or abstract class for creating an object but let the subclasses decide which class to instantiate.参考:refactoringguru | factory-methodjavatpoint | factory-method-design-pattern博客园| 工厂方法简单工厂的问题简单工厂把可能很复杂的对象创建过程分装在工厂类内部,客户

2020-06-28 00:45:45 125

原创 【设计模式 04】代理模式

代理模式代理模式( Proxy):为其他对象提供一种代理以控制对这个对象的访问。参考:refactoringguru | proxy什么是代理模式有时候如果想要访问某个对象,但又没办法直接访问或不方便直接访问,可以使用代理模式,代理模式为想要访问的那个真实对象提供一种“替身”,将客户端直接对服务端的访问转换为客户端只与代理交互,由代理处理具体的和服务端的交互,代理模式有四种角色,分别是:客户端服务端代理抽象服务接口代理中保留一个真实Server的对象,并且代理和真实Server实

2020-05-30 22:25:56 182

原创 Linux(Ubuntu 19.10)下 Qt5 连接 MySQL(QMYSQL driver not loaded)

Linux(Ubuntu 19.10)下 Qt5 连接 MySQL安装好 MySQL 和 QtQt 连接 MySQL 的代码QSqlDatabase d=QSqlDatabase::addDatabase("QMYSQL");//加载mysql驱动,这个字符串是固定的d.setHostName("127.0.0.1");d.setDatabaseName("mysql"); //数据库名称d.setPort(3306); //数据库端

2020-05-29 16:37:38 645

原创 【设计模式 03】装饰模式——俄罗斯套娃?

装饰模式(俄罗斯套娃?)装饰模式:动态的给某些对象添加额外的功能参考:简书 | 装饰模式博客园 | 简说设计模式——装饰模式博客园 | 装饰器模式 Decorator 结构型 设计模式 (十)什么是装饰模式装饰模式也叫装饰器模式,python中的装饰器就是这种模式的体现,对于一个类,如果要添加一个新功能,除了修改代码外(违反开闭原则),可以使用继承,但通过继承添加新功能并不适合所有场景,如类不可见或不允许继承需要对一批类似的兄弟类添加同一个新功能时,继承会产生大量的子

2020-05-26 19:45:29 501

原创 用Visual Studio 2019连接 WSL来编译调试C/C++项目

因为有作业要在Linux环境下写,用虚拟机直接卡成PPT,VS code又不会调试,就搞一下VS 2019吧。环境windows 10 + WSL(Ubuntu 18.04.4) + Visual Studio Community 2019Linux 里要有C/C++环境(gcc等)VS要有 适用于 Linux 开发的 Visual C++产品,如果没有的话在 Visual Studio Installer 好像可以下载(我不知道)SSHVS连接远程系统依靠SSH,所以需要在WSL里和Win

2020-05-24 21:29:00 10583

原创 【设计模式 02】策略模式( Strategy)

策略模式参考:CSDN | 策略模式百家号 | 策略模式如果某个系统需要不同的算法(如超市收银的优惠算法),那么可以把这些算法独立出来,使之之间可以相互替换,这种模式叫做策略模式,它同样具有三个角色:环境角色:使用策略的类抽象策略角色:策略共有的抽象类或接口具体策略角色:具体的策略的实现策略模式的优缺点优点:需要新的算法时,只需要拓展策略,而不需要修改原有代码,符合开闭原则。避免出现过多判断分支,提高代码可读性。算法间可方便的进行继承,替换。缺点:客户端必须熟悉

2020-05-23 22:35:52 204

原创 【设计模式 01】简单工厂模式(Simple factory pattern)

简单工厂模式可以根据参数的不同返回不同类的实例参考:CSDN|简单工厂模式简单工厂通过传给工厂类的参数的不同,返回不同的对象,包括三部分组成:具体的”产品“工厂类(实例化并返回”产品“)客户端(使用”产品“)为什么使用简单工厂:”产品“的创建过程可能很复杂,涉及到多个不同类之间的依赖,通过简单工厂将创建过程隐藏在工厂类中,一方面减轻了客户端使用该产品的难度,另一方面也防止了客户端错误创建产品造成的安全问题。将产品的生产和消费过程分离开,这样如果要有了一个新的产品,只需要把它

2020-05-23 00:01:05 183

原创 【设计模式 00】设计模式的六大原则

设计模式的六大原则参考:设计模式六大原则1. 单一职责原则一个类只负责一个明确的功能优点:降低类的复杂度,提高代码可读性和可维护性降低变更时对其他功能的影响2. 里氏替换原则**原则一:**若 o1 是 C1 的一个实例化对象, o2 是 C2 的一个实例化对象,如果在使用 C1 的程序中将o1 替换为 o2 而程序行为没有发生变化,那么 C2 应该是 C1 的子类。**原则二:**所有用到基类对象的地方,如果把基类对象替换成子类对象,程序行为不应该发生变化。实现方法:

2020-05-22 23:58:42 613

转载 【Java】synchronized关键字笔记

Java Synchronized 关键字壹. Java并发编程存在的问题1. 可见性问题可见性问题是指一个线程不能立刻拿到另外一个线程对共享变量的修改的结果。如:package Note.concurrency;public class Demo07 { private static boolean s = true; public static void main...

2020-04-14 18:52:39 230

原创 【Java】jdk 1.8 新特性——Lambda表达式

Lambda表达式jdk 1.8 新加入的特性,简化了简单接口的实现函数式接口函数式中只有一个待实现的方法,可以使用@FunctionalInterface注解标注函数式接口.这个接口中只能有一个待实现的方法,但可以包含默认方法,静态方法以及Object类中的public方法package Note.lambda_demo;@FunctionalInterfacepublic int...

2020-04-11 22:17:46 145

原创 【Java】HashMap源码(1.7)

Life is not a ridiculous number of life, the meaning of life lies in life itselfHashMap源码散列集数组和链表可以保持元素插入的顺序,对数组来说,他的优点是拥有连续的存储空间,因此可以使用元素下标快速访问,但缺点在于如果要在数组中第n位删除或插入一个新元素,就需要移动n后面的所有元素,比如在ArrayLis...

2020-04-07 23:59:07 360

原创 红黑树插入时的自平衡

红黑树红黑树实质上是一棵自平衡的二叉查找树,引入带颜色的节点也是为了方便在进行插入或删除操作时,如果破坏了二叉查找树的平衡性能通过一系列变换保持平衡。红黑树的性质每个节点要么是红色,要么是黑色根节点必须是黑色两个红色节点不能相连从根节点出发到达任意叶子节点经过的黑色节点个数相同红黑树的数据结构红黑树实质上是一颗二叉查找树,左子树的值小于根节点的值,右子树的值大于根节点的值。...

2020-04-06 10:14:45 1320 5

原创 Java 注解

Java注解也叫元数据,用来给类,方法或属性添加一个“标记”内置注解// 标注该方法是重写父类的方法@Override// 标注过期弃用的方法,使用这种方法编译器会发出警告@Deprecated// 让编译器忽略有此标记的方法或类的警告@SuppressWarnings("all")自定义标注注解定义定义注解的格式:public @interface...

2020-03-31 22:48:13 244

原创 Java IO 系统

Java IO系统File类用来处理文件目录,既可以代表一个特定文件的名称,也可以代表一组文件的名称,如果代表的是一个文件组,可以调用File.list()方法返回一个字符数组。list()不传递任何参数时返回该目录下所有文件或文件名的字符数组(不会递归遍历目录里面的内容【只返回第一层】)如果想要过滤返回结果,可以传递给它一个FilenameFilter对象,该接口只有一个方法accept,...

2020-03-30 23:15:35 224

原创 【python】生成器

生成器直接总结创建生成器的方法生成器表达式:(i for i in [1, 2])yield: 函数中出现yield这个函数就是生成器,函数(生成器)执行到yield时会返回yield后面的值,并暂停,知道下次被唤醒后会从暂停处接着执行迭代生成器: 生成器实现了python迭代协议,可以使用next()或for迭代向生成器发送消息:如果yield出现在表达式右边,下一次生成器被...

2020-03-27 11:31:39 271

原创 DES的原理及python实现

DES加密算法原理及实现DES是一种对称加密算法【即发送者与接收者持有相同的密钥】,它的基本原理是将要加密的数据划分为n个64位的块,然后使用一个56位的密钥逐个加密每一个64位的块,得到n个64位的密文块,最后将密文块拼接起来得到最终的密文加密加密过程DES加密过程接收一个明文盒一个64位的密钥key,明文字符串会被转换为对各64位的块,加密过程以块位单位,经过初态转换,16轮循环加密...

2020-03-08 19:33:07 5185 9

原创 龙王我当定了(一个在QQ刷龙王的脚本)

自从学了python,龙王再也没丢过,就是经常被打,QQ 和 TIM 都可以,发送时要把聊天窗口打开。import win32guiimport win32conimport win32clipboard as wimport randomfrom time import sleepdef get_message(): """ 获取随机字符串 """ ...

2020-03-04 16:58:33 9771 7

原创 HyperLogLog原理与在Redis中的使用

Redis-HyperLogLog基于HyperLogLog算法,使用极小的空间完成巨量运算Redis 中HyperLogLog 基本使用常用命令PFADD key element [element …]: 将任意数量的元素添加到指定的 HyperLogLog 里面。PFCOUNT key [key …]: 计算hyperloglog的独立总数prmerge destkey sou...

2020-02-21 22:09:34 429

NewtonInterpolation.py

牛顿插值python实现(基于差商表) xi 0阶 1阶 2阶 因子 ---- ---- ---- ---- ----------------- 1 1 1 3 2 0.5 1*(x - 1) 2 -1 3.0 2.5 1*(x - 1)*(x - 3) 牛顿插值多项式为0.5*x + 2.5*(x - 3)*(x - 1) + 0.5 -0.625000000000000

2019-12-02

DAY10_1.py

## DAY 10. 鸭子类型 这个概念来源于美国印第安纳州的诗人詹姆斯·惠特科姆·莱利(James Whitcomb Riley,1849-1916)的诗句:”When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.” > 当我看到一只像鸭子一样走路,像鸭子一样游泳,像鸭子一样嘎嘎叫的鸟,我就叫它鸭子。 鸭子类型在动态编译语言如python,go中经常使用,意思是程序只关心对象行为而不关心对象类型,如 ```py class Duck: def __init__(self, name): self._name = name def call(self): print("gua gua gua") class Frog: def __init__(self, name): self._name = name def call(self): print("gua gua gua") def quack(duck): duck.call() if __name__ == '__main__': duck = Duck('Duck') frog = Frog('Frog') quack(duck) quack(frog) ``` 虽然duck和frog不是同一个类型,但他们都有相同的方法call,那就可以把他们“当作同一种类型——鸭子类型”

2019-07-23

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

TA关注的人

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