自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(255)
  • 问答 (1)
  • 收藏
  • 关注

原创 go context详解

一.前言之前写过一篇context的源码学习 context 源码学习 ,写完还觉得,嗯,我终于弄懂了context,但是最近在面试,别人一问我只能说个大概,到底还是理解不深,只是看了源码,没有往深层去想,他为什么要这么设计。(坦率的说个人认为面试蛮看缘分,有时候对方问的你恰好了解就撞上了,有时候对方问的你在日常中没有用到,就确实不懂,但是作为面试官是不会故意问一下冷僻的东西的,所以可能面试官问的就是他们研发有用到的东西,那我虽然在当前工作中没有这个场景,但是多学习留个印象,总是好的。)二.正文

2022-02-20 11:08:05 2435 2

原创 83--86 动态规划​

动态规划动态规划算法通常用于求解具有某种最优性质的问题。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。83 爬楼梯的最少成本数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值cost[i](下标从 0 开始)。每当爬上一个阶梯都要花费对应的体力值,一旦支付了相应的体力值,就可以选择向上爬一个阶梯或者爬两个阶梯...

2021-12-26 17:28:01 199

原创 75 --82 回溯||深度优先算法

75含有 k 个元素的组合给定两个整数n和k,返回1 ... n中所有可能的k个数的组合。力扣https://leetcode-cn.com/problems/uUsW3B///要查询n个数字中k个数的组合,先想到深度优先探索//首先明确跳出条件,k==0的时候说明排列完毕,当数组长小于k的时候可以不必排列//start 开始的坐标用于避免重复 k 还需要几个数 res 最终结果 original 上次排序的值 arr 数组中的值 func dfscombine(s...

2021-12-25 16:17:44 774

原创 72 --74 数组排序

72 合并区间力扣https://leetcode-cn.com/problems/SsGoHC/func merge(intervals [][]int) [][]int { sort.Slice(intervals,func(i, j int) bool { return intervals[i][0] < intervals[j][0] }) var res [][]int arrmap:=make(map[int][]int) var lastsatrt,lastend

2021-12-18 17:40:57 246

原创 67--71 二分查找

67 查找插入位置力扣https://leetcode-cn.com/problems/N6YdxV/func searchInsert(nums []int, target int) int { start:=0 end:=len(nums)-1 for start<=end{ mid:=(start+end)/2 if nums[mid]==target{ return mid }else if nums[mid] >target{ //target在

2021-12-05 18:02:08 75

原创 六十六--67 单调栈

66 直方图最大矩形面具力扣https://leetcode-cn.com/problems/0ynMMM///采用单调栈的思路,栈内数字必须单调递增func largestRectangleArea(heights []int) int { var res int stack:=[]int{} //用于解决边界问题,当只有一个长度的heights传入,不用做特殊处理 heights = append(heights,0) //-1的目的是可以将栈内遗留的值全部排出

2021-12-05 15:15:32 260

原创 每日一练 59--65 哈希表&&栈

哈希表59有效变位词力扣https://leetcode-cn.com/problems/dKk3P7/func isAnagram(s string, t string) bool { if len(s) != len(t) || s == t { //需要字符数相同但是字符顺序不相同 return false } varmap := make(map[uint8]int) for i := 0; i < len(s); i++ { varmap[s[.

2021-12-01 09:27:22 99

原创 每日一练 55--58 滑动窗口

55力扣https://leetcode-cn.com/problems/M1oyTv/思路最短子字符串,没有要求连续,最重要的就是要搞定滑动窗口的定义func minWindow(s string, t string) string { n := len(s) var cntS [128]int var cntT [128]int var cnt int res := s + "#" //获取t字符串字符的数目 for _, c := range t { cntS

2021-11-17 09:17:08 3307

原创 每日一练 52--54 滑动窗口

连续字符字串,遇到连续子串先想滑动窗口52力扣https://leetcode-cn.com/problems/MPnaiL/给定两个字符串s1和s2,写一个函数来判断s2是否包含s1的某个变位词。换句话说,第一个字符串的排列之一是第二个字符串的子串。func checkInclusion(s1 string, s2 string) bool { var start,end int plength:=len(s1) slength:=len(s2) need...

2021-11-09 22:58:57 4131

原创 每一日练 43--51 前缀和

43力扣https://leetcode-cn.com/problems/WGki4K/给你一个整数数组nums,除某个元素仅出现一次外,其余每个元素都恰出现三次 。请你找出并返回那个只出现了一次的元素。思路:可以使用map,也可以使用位数,一定出现三次会导致位一定被3整除,剩下的就是多余的值func singleNumber(nums []int) int { nummap:=make(map[int]int) for i:=0;i<len(nums);i++{...

2021-11-07 23:26:06 3999

原创 每日一练42--前 n 个数字二进制中 1 的个数

力扣https://leetcode-cn.com/problems/w3tCBm/给定一个非负整数n,请计算0到n之间的每个数字的二进制表示中 1 的个数,并输出一个数组。func addBinary(a string, b string) string { alength:=len(a) blength:=len(b) res:=make([]int,0,0) var last int for alength>=1&&blength>=1{...

2021-10-30 18:24:43 116

原创 每日一练41--二进制加法

力扣https://leetcode-cn.com/problems/JFETK5/给定两个 01 字符串a和b,请计算它们的和,并以二进制字符串的形式输出。输入为非空字符串且只包含数字1和0。func addBinary(a string, b string) string { alength:=len(a) blength:=len(b) res:=make([]int,0,0) var last int for alength>=1&&a...

2021-10-30 17:22:15 225

原创 每日一练--40 整数除法

力扣https://leetcode-cn.com/problems/xoh6Oh/给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%'。注意:整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8以及truncate(-2.7335) = -2假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31,2^31−1]。本题中,如果除法结果溢出,则返回 2^31...

2021-10-30 16:28:08 118

原创 每日一练--39玩具套圈

//计算位置x1,y1半径r1的玩具是否在x2,y2处半径位r2的圆圈内func canGetToy(x1, y1, r1, x2, y2, r2 int) bool { //两圆圆心连线距离 length := math.Sqrt(float64((x2-x1)*(x2-x1)) + float64((y1-y2)*(y1-y2))) return length+float64(r1) <= float64(r2)}//套圈游戏func circleGame(toys [][]in.

2021-09-15 23:15:16 126

原创 代码每日一练--39

黑白棋子反转:广度优先算法https://leetcode-cn.com/problems/fHi6rV/func flipChessV2(chessboard []string) int { n := len(chessboard)//矩阵行数 m := len(chessboard[0])//矩阵列数 dx := []int{0, 1, 1, 1, 0, -1, -1, -1} dy := []int{1, 1, 0, -1, -1, -1, 0, 1} matrix := make([]

2021-09-14 23:09:09 83

原创 代码每日一练--total38

前言从现在开始,争取每天写一道题目,再将题目的解答思路分析出来,将每一类型的题归纳到一起去,这一篇主要写动态规划,将不断进行更新,欢迎一起探讨思路。问题1描述https://leetcode-cn.com/problems/wildcard-matching/submissions/给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘’ 的通配符匹配。‘?’ 可以匹配任何单个字符。'’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可

2021-08-02 23:43:18 182

原创 操作系统--虚拟内存

一.前言在之前研究进程上下文切换和golang内存分配器的过程中,发现虚拟内存在其中都扮演着十分重要的角色,之前有学习和了解过虚拟内存,但是随着时间推移也只知道一个概念,现在想要带着问题去再学习一遍虚拟内存,希望这篇文章也能帮助你们更好的理解虚拟内存。1.进程初始化的时候是如何分配的内存2.虚拟内存的具体工作流程二.详细介绍2.1 简介虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占的使用主存。每个进程看到的内存都是一致的,称为「虚拟地址空间」。虚拟内存主要提供了三个能力

2021-07-31 18:11:00 186

原创 golang-- 字典树

一.前言看了百度团队在 infoq 上发表的一篇【如何在秒级完成词表匹配】(https://xie.infoq.cn/article/97b2df7e41456335627ce4cd4)的文章,文章业务背景介绍的很清楚,里面有提到字典树,看到结构图我能明白工作原理,但是总感觉自己处于一种懂与不懂的半懂状态,希望通过写这篇文章我能彻底将字典树闹明白。二.介绍概念字典树是一个存储字符串的树,一个节点的最大子节点数等于字母表的大小。支持在 O(L)时间内的搜索,插入和删除操作,L 是键的长度。应用场景

2021-07-31 18:07:34 440

原创 golang--内存管理器

一.前言笔者在经过了前期基础学习后,用go语言来实现自己面临的业务问题已经不再是问题,所以拥有了另一方面的求知欲--go语言自身的各种包,各种机制是如何实现的,本章主要在探究go语言的内存分配器,希望能用本文讲清楚go语言内存分配器的机制,帮助大家更好地理解go语言的运行机制。二.简介不同于c语言使用malloc和free来主动管理内存,golang让程序员避免了这一切繁杂的操作,它通过escape analysis来分配内存,通过garbage collection(gc)来回收内存,本文主要

2021-07-25 10:41:39 416 2

原创 golang 解析 --- 进程,线程,协程

一.背景在并发编程中进程和线程是不可忽略的两个概念,他们很好的完成了操作系统或者服务对于高并发的需求,然而随着时代的进步,协程的概念应运而生,本文旨在解释协程相对于进程和线程在高并发环境下的优势,所以会先介绍进程,线程,最后讲解协程的调度方式。二.详细介绍2.1 进程2.1.1 概念进程基本上是一个正在执行的程序,它是操作系统中最小的资源分配单位。2.1.2 结构当一个程序被加载到内存中并成为一个进程时,它可以分为四个部分——堆栈、堆、文本和数据。下图显示了主内存中进程的简化布局

2021-07-17 11:58:19 2459

原创 mysql vs mongodb

文章目录结构化与非结构化基础概念数据库体现设计关系存储索引工作中mysql和mongodb总是交替的使用,基本上都是别人使用mongodb就跟着用mongodb,别人使用mysql就跟着用mysql,作为研发人员,虽然不至于像dba大神们一样对这两个数据库知根知底,但是什么时候用mongodb,什么时候用mysql,这两个数据库的特效是什么,还是应该有一个基本认识的,现在就与我来一探究竟吧~结构化与非结构化基础概念mysql是结构化数据库,存储的是结构化的数据mongodb是非结构化数据库,存储的

2020-07-14 21:03:57 313

原创 如何生成webp动图

一张动态的封面 vs 一张静止的封面一方面,在观感上动图能给用户更好的体验,一方面也能让用户短时间获取更多的信息,以下文章将记录如何用视频生成自己想要的动图。方案1.使用ffmpeg从视频前5秒抽取8帧视频帧2.使用谷歌工具img2webp将帧图合并,生成一个webp动图命令ffmpeg -i video.mp4 -ss 00:00:00 -t 5 -vf fps=1.6 -s 280x280 ./images/%d.jpg-i 表示抽帧的视频-ss 表示抽取视频的开始时间-t 表

2020-07-12 10:17:47 3747

原创 mongodb索引初探

文章目录基础理论知识索引作用索引的介绍索引的类别单字段索引复合索引查询分析实际场景分析最近负责解决公司一些mongodb慢查询的问题,解决过程中发现mongodb的索引还有很多特性是可以挖掘的,如果只是了解而不是熟练掌握,那感觉之前花费的功夫就都浪费了,所以决定集中写一篇有关mongodb索引的文章。基础理论知识索引作用索引主要用于在mongodb数据库中执行高效查找,在没有索引的情况下在mongodb中查找数据需要遍历整个collection(相当于mysql的表)的每条document(相当于m

2020-05-16 21:12:22 331

原创 mongodb可以轻松修改旧表字段的原因

这里写自定义目录标题疑问mongodb的介绍简介体系结构解答疑问公司有用到mongodb数据库,最近经常有需求要在原先已经存在大量数据的表中新增字段,所以想探究一下这样子做的效率如何mongodb的介绍简介MongoDB是一个文档数据库,具有您所需的查询和索引所需的可伸缩性和灵活性体系结构MongoDB 的逻辑结构是一种层次结构。主要由:文档(document)、集合(collec...

2020-05-04 15:26:16 806

原创 redis的zset解析

文章目录简介zset的常用命令zset结构分析ziplistdictskiplist最近工作中使用了redis的zset数据结构,为了能够熟练清晰的运用这个数据结构,总结如下。简介zset是一个有序集合,每一个成员有一个分数与之对应,成员不可以重复,但是分实时可以重复的,zset会自动用分数对成员进行排序。zset的常用命令1.zadd添加语句zadd key score member...

2020-05-02 15:36:47 10015 2

原创 mongodb学习--会话模式

初次使用mongodb,对很多的东西都不了解,在此做个学习记录使用的包是mgogolang连接mongodb会话一致性的三种模式strong强一致性模式建立的会话,将始终使用唯一的连接对主服务器进行读写,从而使读写完全一致,使数据保持有序,并始终是最新更新的状态。就分配负载而言,这无疑是没有任何益处的,但这种方式却是读写数据最有保证的。Monotonic单调一致性模式读取的数据并不是...

2020-04-18 14:59:18 379

原创 Go实现设计模式--命令模式

文章目录关于命令模式的例子逻辑关系定义关于命令模式的例子客户点单,创造订单给服务员,服务员将订单给厨师,厨师烹饪。用户使用遥控器,创造命令对象(关电视)给遥控器,遥控对象(电视)关闭。遥控器代码的简单示例:逻辑关系实现遥控器,遥控器有插槽,一个插槽对应一个command对象,插槽的下按对应command对象的命令,这样遥控器不用管这个命令的具体实现,只要调用自己的插槽就可以了。这里的...

2020-04-05 20:04:56 222

原创 Go实现设计模式--单例模式

文章目录定义介绍代码示例定义确保一个类只有一个实例并提供一个全局访问点。介绍意图:再项目中有线程池,缓存,对话框等,这类对象只能有一个,如果创造多个就会有许多问题,所以有了单例模式。关键代码(仅仅针对golang):在方法中要有getInstance()来创建对象,且为了防止多线程错误记得加锁代码示例这个页面的作者将代码写的很详细了,可以前往参考https://blog.cyeam...

2020-03-28 11:02:27 201

原创 Go实现设计模式--工厂模式

文章目录定义实例剖析问题1 简单工厂的学习分析1行动1问题2分析2行动2定义定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。实例剖析问题1 简单工厂的学习你有一个披萨店,你的披萨店有orderPizza()函数,用于新建一个披萨,旧的代码如下(此处简化书上的代码)orderPizze(ptype string)pizza{ Pizza ...

2020-03-22 16:47:23 598

原创 Go实现设计模式--装饰者(器)模式

文章目录定义介绍代码示例定义动态的将责任附加到对象上。若要拓展功能,装饰者提供了比继承更有弹性的替代方案。介绍意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。何时使用:在不想增加很多子类的情况下扩展类。如何解决:将具体功能...

2020-03-18 23:35:26 250

原创 Go实现设计模式--观察者模式

@TOC定义当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。介绍意图 :定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。何时使用:一...

2020-03-14 16:14:53 312

原创 Go实现设计模式--策略模式

go语言中有方法和接口方法:在函数的func和函数名间增加一个特殊的接收器类型,接收器可以是结构体类型或非结构体类型。接收器可以在方法内部访问。创建一个接收器类型为Type的methodName方法。func (t Type) methodName(parameter list) {}接口:接口是方法(方法签名,method signature)的集合。当一个类型定义了接口中的所有方...

2020-03-12 07:51:04 333

原创 Go语言--Go Moudule系列文章学习

最新发表的GO1.14支持在生产环境中使用Module Support,此文通过阅读官方的系列文档给出我自己的个人总结。Part1 Using Go Modules简单定义,Module是存储在文件树中的Go软件包的集合,其根目录中有go.mod文件。go.mod文件定义模块的模块路径(这也是用于根目录的导入路径)及其依赖关系要求,这些依赖关系是为了能成功build所必须的其他模块。 每个...

2020-03-07 14:40:30 448

原创 Go语言--opentracing-go

关于opentracing的简单介绍什么是opentracing?OpenTracing的数据模型opentracing中的跟踪链由span隐性的定义。可别的,跟踪链可以认为是span的有向无环图(DAG),spans之间的边称为References。以下是一个跨度的例子图:解析为时间轴可视化的图:每个span封装以下的状态:(1)操作名称(2)开始时间戳(3)完成时间戳(...

2020-02-27 23:12:03 2760

原创 golang知识点--context

概述context包定义了context的类型,该类型在api和进程之间传递deadline,取消信号和其他请求范围的值。向服务器的传入请求应创建一个上下文,而对服务器的传出调用应接受一个上下文。 它们之间的函数调用链必须传播Context,可以选择将其替换为使用WithCancel,WithDeadline,WithTimeout或WithValue创建的派生Context。 取消上下文后,...

2020-02-25 16:22:31 249

转载 回调函数学习

回调函数定义回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。机制定制一个回调函数提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者当特定的事件或条件发生...

2020-02-24 16:14:29 140

原创 go语言--new与make的区别

new与make的区别:new用来分配内存,不初始化内存,只会将内存置0【返回一个指针,该指针指向新分配的,类型为T的零值】make:只用于slice,map,channel的创建,并返回类型为T(非指针)的已初始化(非0值)的值【这三种类型本质上为引用类型,使用前必须初始化】共同点:都在堆上分配内存,但是行为不同,适用于不同的类型new分配内存make初始化new([]int):返...

2020-02-23 15:49:50 378

翻译 Defer,Panic,Recover简单应用

Defer概述defer语句将函数调用推送到列表上。 周围函数返回后,将执行已保存的呼叫列表。 Defer通常用于简化执行各种清理操作的功能。例子:func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName) if err != nil { ...

2020-02-22 16:21:47 143

原创 golang知识点--reflect

相关知识学习1.go语言的type和interface{}类型go语言是静态类型的语言,这意味着每个变量都有它的静态类型,那是确定且一直固定的一个类型。例如:type MyInt intvar i intvar j MyInt虽然定义了MyInt是int的别名,但是i与j的类型并不是一个类型,除非经过转换。接口概述interface:标识固定的方法集接口变量可以存储任何具...

2020-02-22 14:38:34 232

原创 gRPC学习

grpc的概述grpc可以使用**protocol buffers(简单应用可以参考上一篇文章)**作为接口定义语言(IDL)和底层消息交换格式。优点使用GRPC,我们可以在A.Pro文件中定义我们的服务,并实现任何GRPC支持的语言中的客户端和服务器,这可以在从谷歌内部服务器到您自己的平板电脑的环境中运行——所有的语言和环境之间的通信的复杂性都由GRPC处理。我们还获得了使用协议缓冲区的所...

2020-02-13 14:46:47 464

空空如也

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

TA关注的人

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