- 博客(37)
- 收藏
- 关注
原创 robfig/cron-go cron定时任务库架构剖析
深入剖析go 定时任务库 cron 原理实现:https://github.com/robfig/cron/tree/v3.0.1
2022-12-01 17:42:19
1222
原创 Golang中的内存管理
文章目录一、何为内存?二、内存为什么需要管理?三、操作系统是如何管理内存的?3.1 虚拟内存3.2 MMU内存管理单元3.2.1 虚拟内存本身怎么存放内存命中率CPU Cache举个例子程序的内存布局结论要搞明白 Go 语言的内存管理就必须先理解操作系统以及机器硬件是如何管理内存的因为 Go 语言的内部机制是建立在这个基础之上的它的设计本质上就是尽可能的会发挥操作系统层面的优势而避开导致低效情况一、何为内存?说到内存如果您没有任何的软件基础知识那么第一印象应该想到的
2022-01-02 22:27:55
1122
转载 Go语言内存模型及堆的分配管理(下)
Go内存管理文章目录Go内存管理原文Go内存管理的基本概念Go内存大小转换Go内存分配小对象的内存分配大对象的内存分配Go垃圾回收和内存释放Go的栈内存总结原文前文提到Go内存管理源自TCMalloc但它比TCMalloc还多了2件东西:逃逸分析垃圾回收这是2项提高生产力的绝佳武器这一大章节我们先介绍Go内存管理和Go内存分配最后涉及一点垃圾回收和内存释放Go内存管理的基本概念Go内存管理的许多概念在TCMalloc中已经有了含义是相同的只是名字有一些变化
2022-01-02 22:05:12
487
转载 Go语言内存模型及堆的分配管理(上)
前言文章目录前言原文正文存储基础知识回顾存储金字塔虚拟内存栈和堆堆内存管理TCMalloc基本原理原文这篇文章主要介绍Go内存分配Go内存管理会轻微涉及内存申请和释放以及Go垃圾回收从非常宏观的角度看,Go的内存管理就是下图这个样子我们今天主要关注其中标红的部分Go这门语言抛弃了C/C++中的开发者管理内存的方式实现了主动申请与主动释放管理增加了逃逸分析和GC将开发者从内存管理中释放出来让开发者有更多的精力去关注软件设计而不是底层的内存问题
2022-01-02 21:52:38
191
原创 力扣精选题——LRU缓存
题目介绍请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入
2021-12-28 12:48:59
481
原创 力扣精选题——单词拆分(dp+dfs+dfs(备忘录)+bfs+bfs(备忘录))
一道题通过动态规划,深搜,深搜+备忘录,广搜,广搜+备忘录五种方法来分析
2021-12-24 14:04:14
442
原创 Go底层 - 反射与interface③
接口的构造过程是怎样的我们已经看过了 iface 和 eface 的源码知道 iface 最重要的是 itab 和 _type为了研究清楚接口是如何构造的接下来我会拿起汇编的武器还原背后的真相来看一个示例代码:package mainimport "fmt"type Person interface { growUp()}type Student struct { age int}func (p Student) growUp() { p.ag
2021-12-21 21:04:46
159
原创 力扣精选题——翻转数位
这也是一道题解挺精彩的题题目链接public class FlipDigital { /* dp-易 https://leetcode-cn.com/problems/reverse-bits-lcci/ 给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。 */ // 测试 public static int reverseBits(int num) {
2021-12-21 15:13:27
264
原创 Go底层 - 反射与interface②
深度解密Go语言之关于 interface 的 10 个问题(一)文章目录[深度解密Go语言之关于 interface 的 10 个问题(一)](https://mp.weixin.qq.com/s/EbxkBokYBajkCR-MazL0ZA)Go 语言与鸭子类型的关系值接收者和指针接收者的区别方法值接收者和指针接收者两者分别在何时使用iface 和 eface 的区别是什么接口的动态类型和动态值【引申1】接口类型和 `nil` 作比较【引申2】 来看一个例子,看一下它的输出:【引申3】如何打印出接口的
2021-12-20 19:00:00
310
原创 力扣精选题——字符串转换整数(atoi)
这道题,官方解法是极为漂亮,很有助于开拓视野,理解互联网技术的本质。但是并不会一下子就让你醒悟,而是在以后的某一天,你会恍然大悟的想到今天这道题,心中不由感叹“原来如此!”题目链接一般解法class Func2 { public int myAtoi(String s) { int i = 0; int len = s.length(); int sign = 1; int res = 0; // 如果字符串前导
2021-12-20 13:56:10
173
原创 Go底层 — 反射①
文章目录反射概念关于静态类型特殊的静态类型interface特殊的interface类型interface类型是如何表示的反射三定律反射第一定律:反射可以将interface类型变量转换成反射对象反射第二定律:反射可以将反射对象还原成interface对 象反射第三定律:反射对象可修改,value值必须是可设置的总结反射概念官方对此有个非常简明的介绍两句话耐人寻味:反射提供一种让程序检查自身结构的能力反射是困惑的源泉第1条,再精确点的描述是“反射是一种检查interface变量的底层类型
2021-12-19 21:51:57
206
原创 go 并发控制(三)-Context实现原理
文章目录Context实现原理接口定义Deadline()Done()Err()Value()空ContextcancelCtxDone()接口实现Err()接口实现cancel()接口实现WithCancel()方法实现典型使用案例timerCTXDeadline() 接口实现cancel()接口实现WithDeadline()方法实现WithTimeout()方法实现典型使用案例valueCtxValue()接口实现WithValue()方法实现典型使用案例总结Context实现原理context
2021-12-14 20:30:00
1388
原创 go 并发控制(二)-WaitGroup
文章目录WaitGroup前言基础知识信号量WaitGroup数据结构Add(delta int)wait()Done()编程TipsWaitGroup前言WaitGroup是Golang应用开发过程中经常使用的并发控制技术WaitGroup可理解为Wait-Goroutine-Group即等待一组goroutine结束比如某个goroutine需要等待其他几个goroutine全部完成那么使用WaitGroup可以轻松实现下面程序展示了一个goroutine等待另外两个go
2021-12-14 09:30:00
297
原创 go 并发控制(一)-channel
Channel文章目录ChannelChannel前言场景示例总结Channel前言channel一般用于协程之间的通信channel也可以用于并发控制比如主协程启动N个子协程主协程等待所有子协程退出后再继续后续流程这种场景下channel也可轻易实现场景示例下面程序展示一个使用channel控制子协程的例子:package mainimport ( "fmt" "time")func Process(ch chan int) { // Do some wor
2021-12-13 21:59:42
277
原创 go语法糖
语法糖文章目录语法糖前言名字由来Go语言语法糖简短变量声明热身测验前言题目参考答案使用规则前言规则规则一:多变量赋值可能会重新声明规则二:不能用于函数外部变量作用域问题可变参函数前言函数特征使用举例不传值传递多个参数传递切片总结前言名字由来语法糖(Syntactic sugar)的概念是由英国计算机科学家 Peter J. Landin 提出的用于表示编程语言中的某种类型的语法这些语法不会影响功能但使用起来却很方便语法糖也称糖语法这些语法不仅不会影响功能编译后的结果跟不使用语
2021-12-13 12:15:00
436
原创 go底层系列-mutex原理剖析
go底层系列-mutex原理剖析文章目录go底层系列-mutex原理剖析前言Mutex数据结构Mutex结构体Mutex方法加解锁过程简单加锁加锁被阻塞简单解锁解锁并唤醒协程自旋过程什么是自旋?自旋条件自旋的优势自旋的问题Mutex模式normal模式starvation模式woken状态为什么重复解锁要panic编程Tipsrwmutex前言读写锁数据结构类型定义接口定义Lock()实现逻辑Unlock()实现逻辑RLock()实现逻辑RUnlock()实现逻辑场景分析写操作是如何阻止写操作的写操作是如
2021-12-13 09:45:00
777
原创 go底层系列-range原理剖析
range文章目录range前言热身实现原理range for slicerange for arrayrange for maprange for channel编程Tips总结前言range是Golang提供的一种迭代遍历手段可操作的类型有数组、切片、Map、channel等实际使用频率非常高热身func RangeSlice(slice []int) { for index, value := range slice { _, _ = index, value }
2021-12-12 21:19:30
1010
原创 go底层系列-select原理剖析
select文章目录select前言热身实现原理case数据结构select实现逻辑selectgo实现伪代码如下:总结前言select是Golang在语言层面提供的多路IO复用的机制可以检测多个channel是否ready(即是否可读或可写)使用起来非常方便热身// 下面的程序输出是什么?func main() { chan1 := make(chan int) chan2 := make(chan int) go func() { chan1 <- 1 time
2021-12-12 09:15:00
647
原创 go底层系列-defer原理剖析
go底层系列-defer原理剖析目录go底层系列-defer原理剖析defer前言热身defer规则规则一:延迟函数的**参数在defer语句出现时就已经确定下来**了规则二:延迟函数执行按后进先出顺序执行,即**先出现的 defer最后执行**规则三:延迟函数可能操作主函数的具名返回值函数返回过程主函数拥有匿名返回值,返回字面值主函数拥有匿名返回值,返回变量主函数拥有具名返回值defer 实现原理defer 数据结构defer的创建和执行总结defer前言defer语句用于延迟函数的调用每
2021-12-11 16:45:00
651
原创 go底层系列-string底层实现
String文章目录String数据结构string操作声明[]byte转stringstring转[]byte字符串拼接为什么字符串不支持修改?[]byte转换成string一定会拷贝内存吗?string和[]byte如何取舍go标准库 builtin 给出了所有内置类型的定义。源代码位于 src/builtin/builtin.gostring是8比特字节的集合通常但并不一定是UTF-8编码的文本。另外,还提到了两点,非常重要:string可以为空(长度为0),但不会是nilstri
2021-12-11 09:00:00
659
原创 go底层系列-struct底层实现
struct文章目录struct前言Tag的本质Tag规则Tag是Struct的一部分获取TagTag存在的意义Tag常见用法前言Go的struct声明允许字段附带 Tag 来对字段做一些标记。该 Tag 不仅仅是一个字符串那么简单,因为其主要用于反射场景reflect 包中提供了操作 Tag 的方法,所以 Tag 写法也要遵循一定的规则。Tag的本质Tag规则Tag 本身是一个字符串,但字符串中却是: 以空格分隔的 key:value 对 。key : 必须是非空字符串,字符串不
2021-12-10 22:30:00
775
原创 go底层系列-map底层实现
mapmap示例数据结构示例哈希冲突示例负载因子渐进式扩容扩容的前提条件增量扩容示例等量扩容查找过程插入过程参考map的整体结构图hmapbucketmap使用哈希表作为底层实现一个哈希表里可以有多个哈希表节点,也即bucket每个bucket就保存 了map中的一个或一组键值对示例下图展示一个拥有4个bucket的map:本例中, hmap.B=2 , 而hmap.buckets长度是2^B为4.元素经过哈希运算后会落到某个bucket中进行存储查找过程类似bucket 很多
2021-12-10 17:30:00
3711
1
原创 go底层系列-iota底层实现
iota文章目录iota前言热身规则编译原理前言我们知道iota常用于const表达式中我们还知道其值是从零开始const声明块中每增加一行iota值自增1使用iota可以简化常量定义,但其规则必须要牢牢掌握热身// 下面常量定义源于GO源码,下面每个常量的值是多少?package maintype Priority intconst ( LOG_EMERG Priority = iota LOG_ALERT LOG_CRIT LOG_ERR LOG_WARNING
2021-12-10 17:00:00
246
原创 go底层系列-slice底层实现
sliceslice前言热身环节实现原理数据结构使用make创建Slice例如使用数组创建Slice例如Slice扩容例如Slice Copy特殊切片例如编程TipsSlice总结slice前言又称动态数组,依托数组实现方便的进行扩容、传递等正因为灵活,如果不了解其内部实现机制,有可能遭遇莫名的异常现象。热身环节// 题目一package mainimport "fmt"func main() { var array [10]int var slice = array[5:6
2021-12-10 05:30:00
712
原创 go底层系列-channel底层实现
chanchan数据结构环形队列等待队列类型信息锁channel读写创建channel创建伪代码向channel写数据图示从channel读数据图示关闭channel常见用法单向channel实例select实例结论range实例chanchannel是Golang在语言层面提供的goroutine间的通信方式主要用于进程内各goroutine间通信跨进程通信,建议使用分布式系统的方法来解决数据结构环形队列作为缓冲区长度是创建chan时指定的下图展示了一个可缓存6个
2021-12-09 21:15:10
1413
原创 结构体字段tag
Tag方面一什么是TagTag是结构体中某个字段别名,可以定义多个,空格分隔type Student struct { Name string `ak:"av" bk:"bv" ck:"cv"`}Tag的作用Tag相当于该字段的一个属性标签,Go语言中,一些包会通过tag来做相应判断// 举个例子:type Student struct { Name string}// 现在将一个结构体实例化一个s1s1 := Student { Name: "s1
2021-08-08 15:01:54
1455
原创 go-gin框架二次封装go-sword详解(路由+中间件+开启关闭服务篇)
main方法中注册路由// 5. 注册路由 run.Run()run方法中,转到router.Setup文件中,下面具体展开进行讲解,r := router.Setup(config.ApplicationConfig)传入存储配置信息的结构体,返回一个引擎。在这一步对其进行配置// Setup 路由设置func Setup(cfg *config.Application) *gin.Engine {}gin.ReleaseMode:三种mode分别对应了不同的场景。在我们开发
2021-02-21 14:07:16
2496
1
原创 第一个基于go-gin框架的项目(一)
Go-gin框架经验总结社团管理项目main文件:调用config包中的Init初始化函数:Config方法中的函数作用:viper.AddConfigPath:查找配置文件所在路径viper.SetConfigName:配置文件名称viper.ReadInConfig:查找并读取配置文件LogINfo方法中的函数作用:OpenFile方法中的第一个参数是文件路径,第二个参数是控制文件的打开方式,第三个参数则是控制文件模式os.O_RDWR:只读模式os.O_CREATE:创建
2021-01-31 20:59:17
792
8
原创 Goland在debug时发现delve版本太老??结果一直报错安装不上
1.先进入"%GOPATH%\src\github.com\go-delve"(没有这些目录则手动创建,GOPATH这个环境变量也要事先配置好),将dlv文件夹删除(没有这个文件夹就忽略)2.在上述文件夹下cmd中即:这个位置单击一下,输入cmd,然后键入:go get -u github.com/derekparker/delve/cmd/dlv这样子先从github拷贝下来3.根据网上建议:go install github.com/derekparker/delve/.
2020-10-23 16:18:37
1535
原创 使用pycharm创建django项目时一直卡在installing django(pip下载Django超时)
先写一下使用pycharm创建虚拟环境并创建django项目方法:然后点击创建接下来,如果你一直卡在那么你就需要在终端修改镜像源win+R输入cmd然后输入pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package这是临时使用清华大学镜像源注意,simple不能少, 是https而不是http也可以设为默认:首先升级你的pip到最新版,pyth...
2020-07-12 11:25:59
6412
4
原创 ?: (admin.E403) A django.template.backends.django.DjangoTemplates instance must be configured in T
在练习jianja2模板的时候,报错:django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:ERRORS:?: (admin.E403) A 'django.template.backends.django.DjangoTemplates' instance must be configured in TEMPLATES in order to use
2020-06-13 15:25:52
6264
9
原创 Specifying a namespace in include() without providing an app_name 报错解决
在学习django时,出现报错:根据报错信息提示:找到报错位置:并打开这个conf.py文件发现:发现还需要加上app_name.于是代码改成:OK。问题解决。版本问题
2020-06-07 09:50:11
265
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人