- 博客(90)
- 资源 (7)
- 收藏
- 关注
原创 数据结构—链表
相关数据结构实现用go语言实现相关代码做题合集:https://github.com/longpi1/algorithm-pattern链表(Linked List)是一种常见的数据结构,它由一系列节点(Node)组成,每个节点包含数据和指向下一个节点的指针(在双向链表中还包括指向前一个节点的指针)。下面我将详细介绍链表的特点、优缺点,并提供 Go 语言实现的示例。
2025-06-28 14:11:07
340
原创 数据结构—栈与队列
栈支持两种主要操作:Push(入栈):将元素添加到栈顶。Pop(出栈):从栈顶移除并返回元素。其他辅助操作包括检查栈是否为空、获取栈长度等。切片模拟栈// 创建栈// push压入// pop弹出// 检查栈空队列支持两种主要操作:Enqueue(入队):将元素添加到队列尾部。Dequeue(出队):从队列头部移除并返回元素。其他辅助操作包括检查队列是否为空、获取队列长度等。// 创建队列// enqueue入队// dequeue出队// 长度0为空。
2025-06-28 14:10:34
339
原创 算法复杂度分析
算法分析不是精确计算时间/空间,而是关注其随输入规模增长的趋势。大O表示法是描述这种趋势的标准工具,它关注的是上界和最坏情况(通常)。选择合适的算法对程序的性能至关重要,尤其是在处理大规模数据时。一个 O(n^2) 算法在n很大时会比 O(n log n) 算法慢得多。在Go中,除了理论分析,还可以使用testing包中的基准测试 (benchmark) 功能来实际测量代码段的执行时间,这对于比较不同实现或优化效果很有帮助。但基准测试结果受具体机器和环境影响,而复杂度分析提供的是更通用的理论指导。
2025-06-28 14:07:22
1179
原创 03.Golang 切片(slice)源码分析(二、append实现)
先来看看append// 内置函数append将元素追加到切片的末尾。// 如果有足够的容量,则重新划分目标以容纳// 新建元素。// 如果没有,将分配一个新的底层数组。// Append返回是更新后的切片。Go编译器不允许调用了 append 函数后不使用返回值。// 因此,有必要存储append的结果,通常在保存切片本身的变量中:// 常见用法:// 添加元素// 直接追加一个切片//// 作为特殊情况,将字符串附加到字节片是合法的,如下所示://append。
2025-05-12 21:53:05
1402
原创 02.Golang 切片(slice)源码分析(一、定义与基础操作实现)
slice 的底层数据是数组,slice 是对数组的封装,它描述一个数组的片段。两者都可以通过下标来访问单个元素。数组是定长的,长度定义好之后,不能再更改。在 Go 中,数组是不常见的,因为其长度是类型的一部分,限制了它的表达能力,比如 [3]int 和 [4]int 就是不同的类型。而切片则非常灵活,它可以动态地扩容。切片的类型和长度无关。数组就是一片连续的内存, slice 实际上是一个结构体,包含三个字段:长度、容量、底层数组。
2025-05-12 21:52:30
1258
原创 DeepWiki: Github的百科全书
DeepWiki通过AI技术重新定义了代码文档的生成与交互方式,其开源免费模式为开发者社区带来革新。尽管存在准确性和成本挑战,但其在提升代码可读性、促进开源协作方面的潜力已得到广泛认可。
2025-05-12 21:50:48
1464
原创 hashicorp raft源码分析(二、日志复制与安全性实现)
上述过程简单来说就是, 上层写日志, leader 同步日志, follower 接收日志, leader 确认提交日志, follower 跟着提交日志.
2025-05-12 21:43:57
1081
原创 hashicorp raft源码分析(一、项目介绍与Leder选举实现)
本文基于 hashicorp/raftv1.7.3版本进行源码分析API手册:https://pkg.go.dev/github.com/hashicorp/raftraft论文中文解读:https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md在阅读文章前需要有一定的 raft 基础, 不然直接看源码会一头雾水.Raft是一种分布式一致性算法。
2025-05-12 21:42:53
1122
原创 Golang的语言特性与鸭子类型
上述是对于的最有名的阐述。意思是对于事物类型的判断, 不取决于事物本身预设的标签(label), 而取决于判断者判断时需要用到的条件, 如果事物拥有符合条件的属性,那么在判断者眼中它就是那种类型。当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。在鸭子类型中,关注点在于对象的行为,能做什么;而不是关注对象所属的类型。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为“鸭子”的对象,并调用它的“走”和“叫”方法。
2024-11-24 17:38:45
1135
原创 不注册访问 Claude3 大模型
随着Claude3大模型的出世,大模型霸主地位已经发生易位,但是国内使用Claude3官网 无论是注册都不容易,本篇文章主要介绍如何不通过Claude3 官网实现Claude3 大模型的使用,
2024-03-08 20:29:10
2303
原创 Viper反序列化解析字段不成功问题
name、NAME、NaMe 等等,如果名称不一致没有指定 tagName ,则默认为 mapstructure,这也是为什么带下划线或者名称不一致的字段不加 mapstructure标签无法解析的原因。默认情况下,mapstructure 使用结构体中字段的名称做这个映射,不区分大小写,比如 Name 字段可以映射到。mapstructure 用于将通用的map[string]interface{}解码到对应的 Go 结构体中。通过mapstructure映射名称。
2024-03-08 20:26:15
597
原创 Golang对比Java、python为什么要保留指针
Go 的指针一方面提供了引用语义,另一方面像 C 语言一样给了开发者灵活管理内存的能力。参考链接:樊冰心:https://www.zhihu.com/question/399589293/answer/2242103027。
2024-01-14 10:55:29
1214
原创 面试常见的场景设计题
所谓海量数据处理,就是指数据量太大,无法在较短时间内迅速解决,或者无法一次性装入内存。针对时间,可以采用巧妙的算法搭配合适的数据结构,如Hashmapbit-map堆数据库倒排索引/Trie树;针对空间,大而化小,分而治之(hash映射),把规模大化为规模小的,各个击破。海量数据分而治之/hash映射 + hash统计 + 堆/快速/归并排序;Trie树/Bloom filter/Bitmap数据库/倒排索引(问题实例:文档检索系统,查询那些文件包含了某单词,比如常见的学术论文的关键字搜索。
2024-01-14 10:42:56
2193
1
原创 gRPC vs HTTP
在HTTP/2协议中**,HTTP消息被分解独立的帧(Frame),交错发送,帧是最小的数据单位。然而当你的watcher成千上万的时,即使集群空负载,大量轮询也会产生一定的QPS,server端会消耗大量的socket、内存等资源,导致etcd的扩展性、稳定性无法满足Kubernetes等业务场景诉求。在etcd v3中,为了解决etcd v2的以上缺陷,使用的是基于HTTP/2的gRPC协议,双向流的Watch API设计,实现了连接多路复用。HTTP/2 不是 gRPC 独占的。
2024-01-14 10:39:59
1661
原创 05.neuvector网络学习与管控实现
dp侧收到ctrl_add_tap_port数据后,执行路径如下dp_ctrl_handler->dp_ctrl_add_tap_port->dp_data_add_tap->dp_alloc_context->dp_open_socket(创建AF_PACKET的socket并绑定容器的网络接口eth0)->dp_ring_v1(通过setsockopt创建的接收的环形缓冲区-)
2024-01-13 20:58:13
1470
2
原创 03.neuvector之组的划分逻辑
NeuVector 会自动从正在运行的应用程序中创建组。这些组以前缀‘nv‘开头。您也可以使用 CRD 或 REST API 手动添加它们,并且可以在任何模式下创建、发现、监视或保护。网络和响应规则需要这些组定义。对于自动创建的组(以“nv”开头的“学习”组) ,NeuVector 将学习网络和处理规则,并在发现模式下添加它们。自定义组不会自动学习和填充规则。注意: nv组开始时默认为进程/文件保护启用零漂移。
2024-01-13 20:50:14
1115
原创 02.neuvector之Enforcer容器功能介绍
Enforcer容器在neuvector中主要负责网络与DLP/WAF的规则策略的实现以及网络数据的采集上报;以DaemonSet的方式运行,主要有三个进程monitor、agent、dp;monitor:负责监控其他进程是否正常运行以及资源消耗等;agent:负责与controller容器进行交互,通过grpc与consul实现数据上报与策略下发,其中进程与文件的策略学习与防护由agent做,网络相关具体实现由dp进程实现;dp:负责网络的数据采集上报,网络拦截告警等相关功能;
2024-01-13 20:48:19
613
原创 PostgreSQL对比Mysql
需要根据具体的应用需求和业务场景来选择适合的数据库。PostgreSQL的灵活性、性能和可靠性使其适用于各种不同类型的应用场景。无论是开发Web应用、处理地理空间数据,还是进行数据分析和构建企业级应用,PostgreSQL都提供了强大的功能和支持[
2023-12-02 16:58:44
647
原创 04.PostgreSQL是如何实现隔离级别的?
PostgreSQL 是支持事务的,事务的四大特性是原子性、一致性、隔离性、持久性,我们这次主要讲了隔离性。当多个事务并发执行的时候,会引发脏读、不可重复读、幻读这些问题,那为了避免这些问题,SQL 提出了四种隔离级别,分别是读未提交、读已提交、可重复读、串行化,从左往右隔离级别顺序递增,隔离级别越高,意味着性能越差,PostgreSQL 引擎的默认隔离级别是读已提交。**在PostgreSQL里,你可以请求四种可能的事务隔离级别中的任意一种。
2023-12-02 16:57:52
599
原创 03.PostgreSQL常用索引与优化
name text如果没有索引,数据库需要扫描整个表才能找到相应的数据。利用EXPLAINParallel Seq Scan 表示并行顺序扫描,执行消耗了 12 s;由于表中有包含大量数据,而查询只返回一行数据,显然这种方法效率很低。关于执行计划的更多信息,可以参考这篇文章。此时,如果在 id 列上存在索引,则可以通过索引快速找到匹配的结果。创建索引需要消耗一定的时间。Index Scan 表示索引扫描,执行消耗了 20 ms;
2023-12-02 16:57:20
543
原创 02.PostgreSQL 查询处理期间发生了什么?
解析器(Parser)解析器根据SQL语句生成一颗语法解析树(parse tree)。分析器(Analyzer)分析器对语法解析树进行语义分析,生成一颗查询树(query tree)。重写器(Rewriter)重写器按照规则系统中存在的规则,对查询树进行改写。计划器(Planner)计划器基于查询树,生成一颗执行效率最高的计划树(plan tree)。执行器(Executor)执行器按照计划树中的顺序访问表和索引,执行相应查询。
2023-12-02 16:56:40
457
原创 Kubernetes集群架构与组件介绍
主要负责所在节点上的Pod资源对象的管理,例如Pod资源对象的创建、修改、监控、删除、驱逐及Pod生命周期管理等。的组件, 该组件公开了 Kubernetes API,API Server 是整个系统的核心组件之一,它是 Kubernetes API 的前端。总之,API Server 是 Kubernetes 系统中非常重要的组件之一,它为整个系统提供了一个统一的入口和管理接口,使得 Kubernetes 的各个组件可以相互协作,从而实现对 Kubernetes 集群的管理和监控等操作。
2023-06-01 22:03:48
918
原创 linux中etc目录下hosts与resolv.conf文件作用
总的来说,和/etc/hosts文件都是非常重要的配置文件,它们可以帮助操作系统正确地解析域名和IP地址的对应关系,从而保证网络连接的正常运行。
2023-06-01 22:03:09
6158
原创 client-go架构与原理介绍
下面对图中每个组件进行简单介绍:client-go 组件:Reflector: 定义在/tools/cache 包内的 Reflector 类型中的 reflector 监视 Kubernetes API 以获取指定的资源类型 (Kind)。完成此操作的函数是 ListAndWatch。监视可以用于内建资源,也可以用于自定义资源。
2023-06-01 22:01:23
2382
原创 Golang通道阻塞情况与通道无阻塞实现
如果通道已满,并且没有协程在读取通道中的数据,那么任何试图将数据写入通道的协程都会被阻塞,直到有空间可用为止。如果通道为空,并且没有协程在等待从通道中读取数据,那么任何试图从通道中读取数据的协程都会被阻塞,直到有数据可用为止。使用select的default语句,在channel不可读写时,即可返回使用select+定时器,在超时时间内,channel不可读写,则返回。
2023-06-01 21:56:41
1842
原创 Golang内存泄露场景与定位方式
循环引用:如果两个或多个对象相互引用,且没有其他对象引用它们,那么它们就会被垃圾回收机制误认为是仍在使用的对象,导致内存泄漏。全局变量:在Golang中,全局变量的生命周期与程序的生命周期相同。如果一个全局变量被创建后一直存在于内存中,那么它所占用的内存就无法被回收,可能会导致内存泄漏。未关闭的文件句柄:如果程序打开了文件句柄但没有关闭它们,那么这些文件句柄所占用的内存就无法被回收,可能会导致内存泄漏。大量的临时对象。
2023-06-01 21:42:10
4195
原创 云原生场景下的容器网络隔离技术
本文从传统网络隔离与云原生网络隔离两个角度出发,分析了现有的网络隔离技术的特点,讨论了云原生场景下网络隔离技术需要满足的特点。首先我们通过分析传统隔离得出,在面对复杂的云原生应用场景时,为了更好保护我们的业务容器安全,我们需要一些新的隔离技术去实现网络隔离。然后,我们通过介绍目前云原生网络隔离的两种实现方案,得出一个理想的容器网络隔离技术需要满足哪些特点。最后,希望通过本篇文章的分享,你能有所收获。
2023-03-24 23:57:52
726
原创 应用层协议:DNS协议
网域名称系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS 协议运行在 UDP 之上,DNS使用TCP和UDP端口53[1]。在网络世界,也是这样的。你肯定记得住网站的名称,但是很难记住网站的 IP 地址,因而也需要一个地址簿,就是 DNS 服务器,它是一个由分层的 DNS 服务器(DNS server)实现的分布式数据库;它还是一个使得主机能够查询分布式数据库的应用层协议。DNS 最早的设
2023-03-24 23:48:50
900
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人