- 博客(203)
- 收藏
- 关注
原创 【Golang】:协程和通道
本文介绍了Go语言中的协程和通道机制。协程(Goroutine)是用户态的轻量级线程,由Go运行时调度,具有创建/切换成本低的特点,通过GMP模型实现并发与并行。通道(Channel)用于协程间通信,分为缓冲和非缓冲两种,支持发送/接收、关闭和遍历操作。文章还详细说明了协程的生命周期状态、调度流程(包括主动/被动/抢占调度),以及通道的特殊用法(只读/只写)和select语句的多路监听、超时控制等应用场景。这些机制共同构成了Go语言高并发编程的核心基础。
2025-08-20 11:49:45
1272
4
原创 【Golang】:面向对象编程
本文介绍了Go语言中的结构体(struct)、方法、封装、继承、接口和类型断言等核心概念。结构体是Go中自定义复合类型的基础,支持多种创建方式、内存对齐和字段标签。方法通过接收者与类型绑定,分为值和指针接收者。Go通过大小写实现封装,使用工厂函数创建私有结构体实例。继承通过结构体嵌套实现,具有特定的字段/方法查找规则。接口定义方法集合,支持隐式实现和多态,包括空接口和接口继承。类型断言用于从接口变量获取具体类型值,支持if和switch两种方式。这些特性共同构成了Go面向对象编程的基础,体现了Go简洁高效的
2025-08-19 15:07:39
766
原创 【Golang】:Map
摘要:Map是Go语言中的键值对集合,key必须是可比较类型,value可为任意类型。Map使用make()或字面量创建,支持增删查改操作:通过map[key]=value添加/修改,使用delete()删除,查询时可用value,ok形式判断key是否存在。Map遍历顺序随机,若需排序需将key拷贝到切片后排序。Map切片是包含多个map的切片,常用于存储结构化数据集合(如多个学生信息)。Map具有动态增长特性,但作为引用类型在函数间传递时较高效。
2025-08-18 15:33:57
441
原创 【Golang】:数组与切片
本文介绍了Go语言中数组和切片的基本概念与操作。数组是固定长度、类型相同的有序集合,具有值类型特性,赋值时会完整拷贝。切片是动态长度的序列,基于底层数组实现,包含指针、长度和容量三要素。文章详细讲解了切片的三种创建方式(直接初始化、引用数组和使用make函数),以及增删查改的常见操作,包括使用append添加元素、切片拼接删除元素等。最后说明了字符串作为只读字节序列的特性,修改字符串需转换为[]byte或[]rune类型。全文通过代码示例展示了数组和切片的核心用法。
2025-08-18 13:24:19
624
原创 【Golang】:错误处理
Go语言异常处理机制摘要:panic用于处理严重运行时错误(如除零、数组越界),会中断执行流程并执行defer语句,若未被捕获则程序崩溃。recover可捕获panic,需在defer函数中使用,使程序恢复执行。errors.New可创建自定义错误,而panic(errors.New(...))可主动触发异常。通过结合defer+recover可实现容错处理,区分可预期错误(error)与不可恢复异常(panic)。典型应用包括:异常捕获后转错误返回、业务参数校验触发panic并恢复等,确保程序健壮性。
2025-08-17 17:14:39
565
原创 【Golang】:函数和包
本文介绍了Go语言中函数和包的核心概念与使用方法。主要内容包括:1. 函数:定义方式、参数传递(值/引用)、多返回值、可变参数、函数类型、匿名函数、defer机制和闭包特性。2. 包管理:包的基本概念、导入方式、init函数执行顺序和可见性规则。3. 特殊特性:展示了defer的延迟执行机制、闭包的环境捕获能力,以及init函数的自动调用特性。文章通过代码示例详细说明了各种语法特性,包括参数传递的区别、多返回值处理、函数类型定义等,并强调了Go语言在函数和包设计上的独特之处。
2025-08-17 16:24:07
969
原创 【Golang】:流程控制语句
Go语言提供了丰富的流程控制语句,包括分支控制(if/else、switch)、循环控制(for)和跳转控制(break/continue/goto/return)。if语句支持变量初始化,switch默认自动跳出且支持fallthrough。for循环支持标准形式、while风格和无限循环,同时提供range遍历数据结构。跳转控制中,break/continue支持标签跳转多层循环,goto可跳转到指定标签,return用于终止函数执行。这些特性使Go的流程控制既灵活又简洁。
2025-08-15 16:52:39
413
1
原创 【Golang】:数据类型
本文介绍了Go语言的基本数据类型与类型转换,主要内容包括:1. 基本数据类型:详细说明了布尔类型、整数类型、浮点类型、复数类型、字符类型和字符串类型的特性、存储空间及使用方式;2. 类型转换:介绍了基本数据类型与字符串之间的相互转换方法,包括使用fmt.Sprintf和strconv包的各种转换函数;3. 常量:讲解了常量的定义方式、多常量声明和iota枚举常量的使用场景。文章通过代码示例展示了各种数据类型的声明、初始化和格式化输出方法,并比较了不同转换方式的适用场景。
2025-08-15 16:23:22
1194
原创 【Golang】:入门基础
本文介绍了Go语言的基础知识、开发环境搭建和基本语法。Go语言由Google开发,具有简洁、高效、并发友好等特点,广泛应用于后端开发、云计算等领域。文章详细说明了Go的发展历程、优势特性及典型应用场景。在开发环境搭建部分,指导读者下载安装Go SDK。基本语法章节涵盖变量声明、标识符命名规则、输入输出操作以及各类运算符的使用方法,包括算术、关系、逻辑、赋值和位运算符等。通过示例代码展示了Go语言的基本语法规则和编程范式,为初学者提供了入门指南。
2025-08-15 13:31:40
1213
原创 【网络】:DNS协议、ICMP协议、NAT技术
DNS协议DNS(Domain Name System,域名系统)协议,是一个用来将域名转化为IP地址的应用层协议。DNS的发展进程互联网前身ARPANET 中通过IP地址和端口号的方式,来确定网络中一个主机上的一个程序。但IP地址是一长串数字,并不便于人们记忆,于是人们发明了一种叫做主机名的东西,并用hosts文件夹来描述主机名和IP地址之间的对应关系。互联网前身ARPANET只有少量主机(1971年仅23台),单一文件HOSTS.TXT由斯坦福研究所(SRI)维护,管理员通过FTP手动下载更
2025-06-29 19:08:03
884
原创 【网络】:数据链路层 —— 以太网协议
本文主要介绍了数据链路层的概念及其相关技术,重点阐述了以太网协议、MAC地址、MTU(最大传输单元)以及ARP协议的工作原理。数据链路层位于OSI模型的第二层,负责在直接相连的节点之间实现可靠的数据传输。以太网是常见的局域网技术,使用MAC地址和帧结构进行通信。MTU规定了单次传输数据的最大长度,确保数据帧在物理网络中可靠传输。ARP协议则用于在局域网中通过IP地址解析对应的MAC地址,实现网络层到数据链路层的地址映射。文章还详细解释了以太网帧格式、MAC地址的作用范围及其在跨网络传输中的变化,以及ARP协
2025-05-16 16:37:09
1616
原创 【网络】:网络层 —— IP协议
IP协议是互联网的核心协议之一,负责在网络层实现数据包的寻址和路由,为上层协议(如TCP、UDP)提供无连接的、不可靠的数据传输服务。IP协议格式包括版本、头部长度、服务类型、总长度、标识、标志、片偏移、生存时间、协议、头部校验和、源IP地址、目标IP地址等字段。分片与组装是IP协议的重要功能,当数据包大小超过某段链路的MTU时,IP层需要对数据进行分片,并在接收端进行组装。路由是网络层的核心功能,负责将数据包从源主机通过最佳路径传输到目标主机,依赖路由表、路由协议及路由器协作实现。网段划分包括传统分类和现
2025-05-14 12:49:03
923
原创 【网络】:传输层协议 —— UDP、TCP协议
UDP协议是一种无连接、不可靠的传输层协议,其核心特点包括无连接性、不可靠传输、面向数据报以及无拥塞控制与流量控制。UDP数据报由头部和数据部分组成,头部包含源端口、目的端口、长度和校验和等字段。UDP通过目标端口号将有效载荷交付给上层协议或应用程序,操作系统根据端口号将数据分发给对应的应用。UDP的缓冲区管理相对简单,主要依赖操作系统的接收和发送缓冲区。基于UDP的应用层协议包括DNS、DHCP、SNMP、TFTP、RTP和WebRTC等,这些协议利用UDP的轻量级和低延迟特性,适用于不同的应用场景。相比
2025-05-11 19:09:11
1644
原创 递归、搜索与回溯算法
原问题必须能够被分解为规模更小的子问题,且子问题与原问题的解决逻辑完全相同(如阶乘、汉诺塔问题)。已知规模为 n−1n−1 的子问题的解,能够直接推导出规模为 nn 的问题的解(如斐波那契数列:F(n)=F(n−1)+F(n−2)F(n)=F(n−1)+F(n−2))。必须存在一个或多个无需递归即可直接求解的简单情况(如阶乘中 0!=10!=1)。若问题满足简单情况,直接返回预设结果。通过递归调用解决更小规模的子问题,并基于子问题的解组合出当前问题的解。
2025-03-30 15:52:35
663
原创 【网络】:应用层 —— HTTP协议
HTTP(Hyper Text Transfer Protocol)协议又叫做超文本传输协议,,是一个简单的请求-响应协议,HTTP通常运行在应用层。HTTP是无连接, 无状态, 工作在应用层的协议。HTTP基于请求-响应模型:客户端(如浏览器)向服务器发送请求,服务器处理请求后返回响应。无连接HTTP协议本身不保存客户端状态,每个请求相互独立。HTTP协议本身是没有维护连接信息的,HTTP的数据回交给网络协议栈传输层的TCP协议,TCP协议是面向连接的。HTTP是可靠传输的,虽然HTTP无连
2025-03-28 20:29:31
907
原创 【C++】:智能指针
C++中的智能指针是一种用于自动管理动态内存的工具,遵循RAII原则,确保资源在对象生命周期结束时自动释放,从而避免内存泄漏和悬空指针等问题。RAII(Resource Acquisition Is Initialization,资源获取即初始化)是C++中管理资源的核心原则,通过对象的生命周期自动化资源管理,确保资源的获取与释放安全可靠。实现步骤// 封装资源到类class FileHandle {private: FILE* file;public: Fi
2025-03-25 19:28:35
1186
1
原创 【C++】:异常
C语言处理错误的方式C++异常的概念C++ 异常处理是一种用于管理程序运行时错误的机制,它通过分离错误处理代码和正常逻辑来提高代码的可维护性。 try { // 可能抛出异常的代码 if (error) throw MyException("Error occurred");} catch (const MyException& e) { // 处理 MyException 类型异常 std::cerr << e.what() << std:
2025-03-21 21:11:27
921
原创 【C++】:C++11详解 —— 线程库
在C++11之前,涉及到多线程问题,都是和平台相关的,比如Windows 和 Linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行了支持,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。线程对象的构造函数C++11 中 std::thread 的构造函数是创建线程的核心接口,负责将可调用对象(如函数、Lambda 表达式、函数对象等)与参数绑定,并启动一个新线程执行。构造函数的用法示例// 基本语法template<
2025-03-20 16:27:19
1064
原创 【C++】:C++11详解 —— 右值引用
可寻址性:左值对应具体的内存地址,可通过取地址操作符(&)获取其地址。int x = 10;int *p = &x; // x 是左值,可取其地址可修改性(除非被 const 限定):左值通常可被赋值,除非被声明为 const。 int a = 5;a = 20; // 合法,a 是左值const int b = 10;b = 30; // 非法,b 是 const 左值,不可修改 int x = 5; // x 是左值,5 是右
2025-03-18 22:43:13
1603
原创 【C++】:C++11详解 —— 入门基础
C++11(原称 C++0x)是 C++ 编程语言的第三个国际标准(ISO/IEC 14882:2011),于 2011 年 8 月正式发布。它是自 1998 年 C++98 标准后的首次重大更新,引入了大量新特性,旨在提高代码效率、简化开发流程并支持现代编程范式。C++11 被广泛认为是 C++ 的“现代化重生”,推动了语言向更高抽象层级、更安全的资源管理和更强大的并发支持发展。C++11 的起源应对现代编程挑战C++03(2003 年小修订版)后,开发者逐渐发现语言在并发编程、泛型编程和资源管
2025-03-16 21:47:15
1039
原创 【C++】:STL详解 —— 布隆过滤器
布隆过滤器(Bloom Filter) 是一种空间效率极高的概率型数据结构,用于快速判断一个元素是否属于某个集合。其核心特点包括:空间高效:基于位数组(bit array)实现,占用内存远小于传统数据结构(如哈希表)。概率性判断:可能返回“可能存在”(存在误判,即假阳性),但绝不会返回“肯定不存在”(无假阴性)。不可删除:标准布隆过滤器不支持元素删除,但改进版(如计数布隆过滤器)通过替换位为计数器可实现删除功能。工作原理:数据结构:使用一个长度为 m 的位数组(bit array),
2025-03-15 17:40:55
1002
原创 【C++】:STL详解 —— 位图(bitset)
位图(Bitmap)是一种基于二进制位(bit)的高效数据结构,用于表示一组布尔值(存在或不存在、真或假)。它的核心思想是:用每一个二进制位(0或1)来标记某个状态或资源是否被占用。第 i 位为 1 → 表示第 i 个元素存在/被占用。第 i 位为 0 → 表示第 i 个元素不存在/未被占用。关键特性:内存高效:每个布尔值仅占用 1 个二进制位(bit),而非传统布尔变量(通常占用 1 字节)。例如:存储 1000 个布尔值:传统布尔数组:1000 字节(1 字节/布尔值)。位
2025-03-14 20:12:48
1677
原创 【C++】:STL详解 —— 哈希表和哈希桶
哈希表通过哈希函数建立关键码与存储位置的直接映射,实现O(1)时间复杂度的快速查找,避免顺序结构(O(N))和平衡树(O(logN))的多次比较。核心机制哈希函数设计将关键码转换为固定范围的存储位置(如 hash(key) = key % capacity)。目标:均匀分布元素,减少冲突。插入与查找流程插入:计算关键码的哈希值,直接存放到对应位置。查找:通过哈希值定位到存储位置,比对关键码是否匹配。
2025-03-12 19:30:21
1300
原创 【C++】:STL详解 —— unordered_set 和 unordered_map类
unordered_set 是 C++ 标准库中的一个容器,用于存储唯一元素,基于哈希表实现1. 基本特性唯一性:元素唯一,不允许重复。无序性:元素不按特定顺序存储,遍历顺序不确定。基于哈希表:通过哈希函数将元素映射到桶(bucket)中,提供平均 O(1) 的查找、插入和删除操作(最坏情况 O(n))。2. 实现原理哈希函数:每个元素通过哈希函数计算哈希值,决定其存储的桶位置。冲突处理:通常采用链地址法(每个桶内用链表管理冲突元素)。动态扩容:当负载因子(元素数 / 桶数)
2025-03-11 09:27:25
1370
原创 【C++】:STL详解 —— 红黑树封装map和set
那能不能不要红黑树的第一个模板参数,只保留第二个模板参数呢?乍眼一看好像是可以的,因为此时红黑树的第二个模板参数当中也是有键值Key的,但实际上红黑树的第一个模板参数是不能省略的。对于set容器来说,省略红黑树的第一个参数当然没问题,因为set传入红黑树的第二个参数与第一个参数是一样的。但是对于map容器来说就不行了,因为map容器所提供的接口当中有些是只要求给出键值Key的,比如find和erase。
2025-03-09 21:52:07
366
原创 【C++】:STL详解 —— 红黑树
红黑树(Red-Black Tree)的核心理念源于对平衡二叉查找树的探索,其历史可追溯至20世纪70年代计算机科学的快速发展期。以下是其关键发展节点:1972年:德国计算机科学家鲁道夫·拜尔(Rudolf Bayer)提出对称二叉B树(Symmetric Binary B-Tree),这是红黑树的前身,旨在将B树的特性(多路平衡)引入二叉结构。1978年:美国计算机科学家罗伯特·塞奇威克(Robert Sedgewick)和莱昂尼达斯·J·吉巴斯(Leonidas J. Guibas)在论文《A
2025-03-08 16:34:51
1307
原创 【C++】: STL详解 —— set和map类
C++标准库提供了多种容器,用于高效管理和操作数据集合。这些容器可分为以下几类:顺序容器(Sequence Containers)关联容器(Associative Containers)容器适配器(Container Adapters)其他类容器类型set 是一个有序关联容器,存储唯一键(Key),键本身即为其值(没有额外的Value)。元素按键的严格弱序规则(默认升序)自动排序,不允许重复键。map 是一个有序关联容器,存储键值对(Key-Value Pair),其中键(Key)唯一
2025-03-06 23:21:05
1371
原创 【C++】:多态
特性重载(Overloading)重写(Overriding)重定义(Redefining)作用域同一作用域(类内/命名空间内)继承体系(基类→派生类)继承体系(基类→派生类)函数关系同名不同参同名同参,基类虚函数同名(参数可不同),基类非虚函数多态性编译时多态(静态绑定)运行时多态(动态绑定)无多态(静态绑定)关键字要求无virtualoverride无常见用途提供同一操作的多种实现实现多态接口修改基类非虚函数行为。
2025-03-06 00:43:02
1055
原创 【C++】:继承
继承的基本语法// 基类成员(数据和方法)// 派生类成员(新增或覆盖基类成员)可以是publicprotected或private,控制基类成员在派生类中的访问权限。继承类型与访问控制C++ 的继承类型通过访问修饰符基类成员访问权限public继承protected继承private继承publicin Derivedprotectedin Derivedprivatein Derivedprotectedprivate不可访问不可访问不可访问默认继承方式:若未指定访问修饰符,
2025-03-05 00:00:09
1037
1
原创 【C++】:STL详解 —— priority_queue类
priority_queue 是 C++ 标准库中的容器适配器,用于实现优先级队列。优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。
2025-03-03 22:20:22
1203
原创 【C++】:STL详解 —— stack和queue类
例如,std::stack默认基于std::deque,但也可选择vector或list。:仅暴露符合数据结构特性的操作(如栈的pushpoptop:用户无需关心内存管理,只需通过适配器的接口操作数据。
2025-02-27 20:58:02
715
原创 【C++】:STL详解 —— list类
可以将一个链表的元素移动到另一个链表中,无需复制元素。:通过移动另一个链表的资源初始化(高效转移所有权):扩展链表,新增元素默认初始化为。用于删除容器当中连续的重复元素。用于删除容器当中满足条件的元素。:返回指向第一个元素的迭代器。:返回指向第一个元素的迭代器。用于删除容器当中特定值的元素。获取list容器最后一个元素。通过另一个链表深拷贝初始化。示例 3: 移动元素区间。获取list容器第一个元素。示例 2: 移动单个元素。的迭代器(尾后迭代器)。的迭代器(尾后迭代器)。内的元素(左闭右开)
2025-02-27 00:02:23
1184
原创 【C++】:STL详解 —— vector类
迭代器的主要作用就是让我们在使用各个容器时不用关心其底层的数据结构,而vector的迭代器在底层实际上就是一个指针。迭代器失效就是指迭代器底层对应指针所指向的空间被销毁了,而指向的是一块已经被释放的空间,如果继续使用已经失效的迭代器,程序可能会崩溃。:返回当前预分配的内存容量(可容纳的最大元素数)指向的元素,返回指向下一个元素的迭代器。:返回指向第一个元素的迭代器。:返回指向第一个元素的迭代器。:返回最后一个元素的引用。的迭代器(尾后迭代器)。的迭代器(尾后迭代器)。:返回第一个元素的引用。
2025-02-25 21:18:35
967
原创 【C++】:STL详解 —— string类
string 是 C++ 标准库中用于处理字符串的类,封装了字符串的常见操作,如拼接、查找、替换等,同时自动管理内存,避免了 C 风格字符数组的繁琐操作。
2025-02-14 17:23:45
864
原创 【C++】:内存管理(new和delete)
一、申请单个类的空间//申请delete p1;// 销毁new 和 delete 调用了构造函数和析构函数C语言://申请free(p1);//销毁malloc和 free 调用了构造函数和析构函数二、申请多个类的空间//申请//销毁free(p2);注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc和free不会。总结C++中如果是申请内置类型。
2025-02-08 21:31:55
1076
原创 【C++】:类与对象
/ 类体:由成员函数和成员变量组成class 为定义类的关键字ClassName 为类的名字{ } 中为类的主体注意类定义结束时后面分号不能省略类体中内容称为类的成员类中的变量称为类的属性或成员变量类中的函数称为类的方法或者成员函数类的两种定义方式一、声明和定义全部放在类体中二、声明放在头文件(.h)中,定义放在源文件(.cpp)中一般情况下,更期望采用第二种方式(声明和定义分离)
2025-02-08 20:09:19
812
原创 【网络】:网络编程套接字
一、定义源 IP 地址(Source IP Address):它是发送数据的设备(如计算机、服务器等)在网络中的唯一标识。就像是发送信件时的寄件人地址,在网络通信中,它用于标识数据的来源。目的 IP 地址(Destination IP Address):这是接收数据的设备在网络中的唯一标识,类似于收件人地址。它告诉网络基础设施,数据最终要传送到哪里。二、在网络通信中的作用数据传输导向:在互联网这样庞大的网络环境中,数据通过多个网络节点(如路由器、交换机等)进行传输。源 IP 地址和目的 IP
2025-01-14 18:26:33
1250
原创 【MySQL数据库】:MySQL访问
因为我们下载的是Linux下使用的库文件,但是是下载在Windows下的,因此下载完毕后需要将其上传到云服务器。而动态库是包含可共享代码和数据的文件,是动态链接过程中被链接的对象。进入解压后 mysql-connector 的目录当中,可以看到有一个 include 子目录和一个lib子目录。因为我们是要使用C语言连接MySQL,所以这里选择MySQL Connector/C。要使用C语言连接MySQL数据库,需要使用MySQL官网提供的库。使用的是一个 main 的测试表 ,里面没有任何数据。
2024-12-15 23:07:46
832
1
原创 【Git】:企业级开发和多人协作开发啊
目录多人协作模拟配置多人协作环境多人同一分支开发多人不同分支开发远程分支删除后的问题企业级开发模型系统开发环境分支设计规范但是这些都是个人的操作,我们如何去实现多人协作开发呢?我们来使用在Linux 系统和Windows系统下的本地仓库来模拟实现多人协作开发为了模拟实现多人协作开发,我们需要先做⼀些准备工作:在 Linux 环境下,再克隆(clone) 同一个项目仓库 我们在拉取(pull)后使用 git branch 查看所有分支,但是发现查找不到拉取(pull)下来的分支 dev其实 git bran
2024-12-12 16:27:47
1461
原创 【Git】:标签管理
理解标签标签 tag,可以简单的理解为是对某次commit的⼀个标识,相当于起了⼀个别名。例如,在项目发布某个版本的时候,针对最后⼀次commit起⼀个v1.0这样的标签来标识里程碑的意义。相较于难以记住的 commit id, 标签(tag) 很好的解决这个问题,因为标签(tag) ⼀定要给一个让人容易记住,且有意义的名字。创建标签在Git中打标签非常简单:首先,切换到需要打标签的分支上查看所有标签git tag默认标签是打在最新提交的commit上的。
2024-12-08 16:00:20
723
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅