当前位置: 首页 > news >正文

C++高级编程(8)

八、标准IO库

1.输入输出流类

1)非格式化输入输出

2)put

#include <iostream>
#include <string>
​
using namespace std;
int main()
{string str = "123456789";for (int i = str.length() - 1; i >= 0; i--) {cout.put(str[i]); //从最后一个字符开始输出}cout.put('\n');return 0;
}

3)write

#include <iostream>
using namespace std;
​
int main() 
{const char * str = "www.cplusplus.com";cout.write(str, 4);return 0;
}

4)格式化输入/输出

  • C++提供了大量的用于执行格式化输入/输出的流操纵符和成员函数。

  • 功能:

    • 打印地址: cout << (void*)a;

    • 整数流的基数:dec、oct、hex和setbase

    • 设置浮点数精度:precision、setprecision

    • 设置域宽:setw、width

  • 注:如果用到了含参数的流操纵算子,则必须包含头文件< iomanip >。

5)<<运算符重载

class Complex
{double real,imag;
public:Complex( double r=0, double i=0):real(r),imag(i){ };friend ostream & operator<<( ostream & os,const Complex & c);
};
​
ostream & operator<<( ostream & os,const Complex & c)
{os << c.real << "+" << c.imag << "i";return os;
}
​
int main()
{Complex c(3, 5);int n = 220;cout << c << "," << n;return 0;
}

6)hex、oct、dec和setbase

#include <iostream>
#include <iomanip>
using namespace std;
​
int main()
{int number;cout << "Enter a decimal number: ";cin >> number;cout << number << " in hexadecimal is: " << hex<< number << endl;cout << dec << number << " in octal is: " << oct << number << endl;cout << setbase(10) << number << " in decimal is: " << number << endl;return 0;
}
​
/*
输出结果:
Enter a decimal
number: 20
20 in hexadecimal is:14
20 in octal is: 24
20 in decimal is: 20
*/

7)浮点精度(precision,setprecision)

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
​
int main()
{double root2 = sqrt( 2.0 );int places;// use fixed point formatcout << fixed;for ( places = 0; places <= 9;places++ ){cout.precision( places );cout << root2 << endl;}for ( places = 0; places <= 9; places++ ){cout << setprecision( places ) <<root2 << endl;}return 0;
}

8)域宽(width,setw)

#include <iostream>
#include <iomanip>
using namespace std;
​
int main()
{int widthValue = 4;char sentence[ 10 ];cout << "Enter a sentence:" << endl;cin.width( 5 );while ( cin >> sentence ){cout.width( widthValue++ );cout << sentence << endl;//cout<<setw(widthValue++) << sentence << endl;cin.width( 5 );}return 0;
}

9)用户自定义的流操纵算子

#include <iostream>
using namespace std;
​
ostream& bell( ostream& output )
{return output << '\a'; // issue system beep
}
​
ostream& carriageReturn( ostream& output )
{return output << '\r'; // issue carriage return
}
​
ostream& tab( ostream& output )
{return output << '\t'; // issue tab
}
​
ostream& endLine( ostream& output )
{return output << '\n' << flush; // issue endl-like end of line
}
​
int main()
{cout << "Testing the tab manipulator:" << endLine<< 'a' << tab << 'b' << tab << 'c' << endLine;cout << "Testing the carriageReturn and bell manipulators:"<< endLine << "..........";cout << bell; // use bell manipulatorcout << carriageReturn << "-----" << endLine;
​return 0;
}

2.文件操作

  • 临时数据

    • 存储在变量和数组中的数据是临时的,这些数据在程序运行结束后都会消失。

  • 文件

    • 目的:文件用来永久地保存大量的数据。

    • 存储:计算机把文件存储在二级存储设备中(特别是磁盘存储设备)。

1)文件中的数据层次

  • 位(bit): 最小数据项:0和1

  • 字符(character)/字节(byte)

    字符:数字、字母和专门的符号

    字节:0、1序列 (常见的是8位/字节)

    字符用字节表示

  • 域(field):一组有意义的字符

  • 记录(record)

    • 一组相关的域

    • 记录关键字(record key):用于检索

  • 文件(file):一组相关的记录

  • 数据库:一组相关的文件

2)文件和流

  • C++语言把每一个文件都看成一个有序的字节流(把文件看成n个字节)

  • 每一个文件或者以文件结束符(end-of-file marker)结束,或者在特定的字节号处结束

  • 当打开一个文件时,该文件就和某个流关联起来

  • 与这些对象相关联的流提供程序与特定文件或设备之间的通信通道

3)文件输出例子

#include <iostream>
#include <fstream> // file stream
#include <cstdlib>
using namespace std;
​
int main()
{ofstream outClientFile( "clients.dat", ios::out );//打开文件// exit program if unable to create fileif ( !outClientFile ) // overloaded ! operator{cerr << "File could not be opened" << endl;exit( 1 );}cout << "Enter the account, name, and balance." << endl<< "Enter end-of-file to end input.\n? ";int account;char name[ 30 ];double balance;
​// read account, name and balance from cin, then place in filewhile ( cin >> account >> name >> balance ){outClientFile << account << ' ' << name << ' ' << balance << endl;//写文件cout << "? ";}return 0; // ofstream destructor closes file
}
​
/*
输出结果:
Enter the account, name, and balance. Enter end-of-file to end input. ? 100 Jones 24.98
? 200 Doe 345.67
? 300 White 0
? 400 Stone -42.16
? 500 Rich 224.62
? ^z
*/

4)文件访问

  • 定义一个流对象

  • 打开文件

  • 访问文件

  • 关闭文件

(1)测试文件打开是否成功
  • 用重载的ios运算符成员函数operator!确定打开操作是否成功。如果open操作的流将failbit或badbit设置,则这个条件返回非0值(true)。

  • 可能的错误是:

    • 试图打开读取不存在的文件

    • 试图打开读取没有权限的文件

    • 试图打开文件以便写入而磁盘空间不足。

(2)测试文件结束符与不合法输入
  • 另一个重载的ios运算符成员函数operator void将流变成指针,使其测试为0(空指针)或非0(任何其他指针值)。如果failbit或badbit对流进行设置,则返回0(false)。

  • 下列while首部的条件自动调用operator void*成员函数:

    Line 26: while (cin >> account >> name >>balance )只要cin的failbit和badbit都没有设置,则条件保持true。输入文件结束符设置cin的failbit。operator void*函数可以测试输入对象的文件结束符,而不必对输入对象显式调用eof成员函数。

(3)打开输入文件
  • ifstream inClientFile( “clients.dat” , ios::in );

  • 生成ifstream对象inClientFile,并将其与打开以便输入的文件clients.dat相关联。括号中的参数传入ifstream构造函数,打开文件并建立与文件的通信线路。

  • 打开ifstream类对象默认为进行输入,因此下列语句等价:

    ifstream inClientFile( “Clients.dat” );

  • 和ofstream对象一样,ifstream对象也可以生成而不打开特定文件,然后再将用open对象与文件相连接。

//文件输出例子
#include <iostream>
#include <fstream> // file stream
#include <iomanip>
#include <string>
#include <cstdlib>
using namespace std;
​
void outputLine( int, const string, double ); // prototype
​
int main()
{// ifstream constructor opens the fileifstream inClientFile( "clients.dat", ios::in );// exit program if ifstream could not open fileif ( !inClientFile ){cerr << "File could not be opened" << endl;exit( 1 );} // end ifint account;char name[ 30 ];double balance;cout << left << setw( 10 ) << "Account" << setw( 13 )<< "Name" << "Balance" << endl << fixed << showpoint;
​// display each record in filewhile ( inClientFile >> account >> name >> balance ){outputLine( account, name, balance );}return 0; // ifstream destructor closes the file
}
​// display single record from filevoid outputLine( int account, const string name, double balance ){cout << left << setw( 10 ) << account << setw( 13 ) << name<< setw( 7 ) << setprecision( 2 ) << right << balance << endl;}

5)文件位置指针

  • 为了按顺序检索文件中的数据,程序通常要从文件的起始位置开始读取数据,然后连续地读取所有的数据,直到找到所需要的数据为止。可能需要反复多次。

  • 文件位置指针( file position pointer):用于指示读写操作所在的下一个字节号;是个整数值,指定文件中离文件开头的相对位置(也称为离文件开头的偏移量)

6)文件指针重新定位

  • istream类和ostream类都提供成员函数,使文件位置指针重新定位

    • istream类的seekg (即“seekget”) :每个istream对象有个get指针,表示文件中下一个输入相距的字节数

    • ostream类的seekp (即“seekput”):每个ostream对象有一个put指针,表示文件中下一个输出相距的字节数

  • seekg和seekp的第一个参数通常为long类型的整数,表示偏移量。第二个参数可以指定寻找方向:

    ios::beg(默认)相对于流的开头定位

    ios::cur相对于流当前位置定位

    ios::end相对于流结尾定位

7)获取文件指针值

  • 成员函数tellg和tellp分别返回get和put指针的当前位置。

下列语句将get文件位置指针值赋给long类型的变量

location。

location = filObject.tellg();

8)更新顺序访问文件

  • 格式化和写入顺序访问文件的数据修改时会有破坏文件中其他数据的危险

  • 例如,如果要把名字“White”改为“Worthington” ,则不是简单地重定义旧的名字。White的记录是以如下形式写入文件中的:

    300 White 0.00

    如果用新的名字从文件中相同的起始位置重写该记录,记录的格式就成为:

    300 Worthington 0.00

  • 因为新的记录长度大于原始记录的长度,所以从“Worthington”的第二个“o”之后的字符将重定义文件中的下一条顺序记录。

  • 出现该问题的原因在于:在使用流插入运算符<<和流读取运算符>>的格式化输入,输出模型中,域的大小是不定的,因而记录的大小也是不定的。例如,7、14、-117、2047和27383都是int类型的值,虽然它们的内部存储占用相同的字节数,因此,格式化输入输出模型通常不用来更新已有的记录。

  • 一种解决方法:将在3000 White 0.00之前的记录复制到一个新的文件中,然后写入新的记录并把300 White 0.00之后的记录复制到新文件中。这种方法要求在更新一条记录时处理文件中的每一条记录。如果文件中一次要更新许多记录,则可以用这种方法。

3.STRING类

  • C++、java等编程语言中的字符串。

  • 在java、C#中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。

  • String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的

为什么需要string?

  • 在内部进行内存分配,从而保证应用程序的健壮性

  • 提供了拷贝构造函数和复制运算符,确保字符串的正确复制

  • 减少程序员创建和操作字符串需要做的工作

  • 提供了增删改查的操作,让程序员可以把精力放在应用程序的主要需求上,而不是字符串的操作细节。

1)string对象的定义和初始化

string s1;
string s2(s1);
string s3("value");
string s4(n,'c');

2)string对象的读写

  • 读入未知数目的string对象

    while(cin>>world)

    cout <<world <<endl;

  • 用getline读取整行

    getline(cin, s);

3)string对象的操作

s.empty();
s.size();
s[n]; //下标操作 范围0~?
s1+s2;
s1=s2;
v1==v2;
!= < <=
> >=

4)string对象中字符的处理

4.异常处理

1)C错误处理机制

  1. 函数返回错误编码

  2. 使用全局变量保存错误编码

  3. 出错时终止程序运行

  • 缺点:

    • 难以统一标准

    • 复杂

    • 构造和析构函数没有返回值

    • 出错就返回,用户接受度低

2)异常处理机制

  • C++异常处理的基本思想是简化程序的错误代码,为程序的健壮性提供了一个标准检测机制:若底层发生问题,则逐级上报,直到有能力处理此异常为止。

  • 异常处理的优势:

  1. 增强程序的健壮性。

  2. 使代码变得更简洁优美,更易维护。

  3. 错误信息更灵活丰富。

  • 缺点:

  1. 性能下降5%~14%。

2. 破坏了程序的结构性。

  1. 完成正确的异常安全的代码,需要付出更大的代价。

3)抛出异常

任何时候,程序在执行中遇到了非正常状况都可以抛出异常异常用throw语句抛出

A *p = new A;

if (p == NULL)

{

throw string(“Out of Memory.”);

}

一旦抛出异常,则程序将在throw语句处跳出

4)捕获异常

异常也由程序员负责捕获

用try{…}catch( ){…}语句来捕获异常

没有捕获的异常将被忽略

try{

// 可能抛出异常的语句

}catch(exceptionType variable){

// 处理异常的语句

}

//捕获异常的例子
#include <iostream>
#include <string>
#include <exception>
using namespace std;
​
int main()
{string str = "http://www.cplusplus.com";try{char ch1 = str[100];cout<<ch1<<endl;}catch(exception e){cout<<"[1]out of bound!"<<endl;}try{char ch2 = str.at(100);cout<<ch2<<endl;}catch(exception &e){ //exception类位于<exception>头文件中cout<<"[2]out of bound!"<<endl;}return 0;
}
//捕获任意异常例子
#include <iostream>
using namespace std;
int main( )
{int a, b;a = 8;b = 0;try{if (b == 0){throw "Divided by Zero!";}else{double c = a/b;cout << c << endl;}}catch(...){cout << "Exception caught!" << endl;}
}

5)异常处理的流程

抛出(Throw)--> 检测(Try) --> 捕获(Catch)

6)异常的传递

  • 产生异常之后,程序会立刻跳转

    • 跳出到最近的一层捕获异常的语句

    • 如果当前没有捕获语句或者捕获语句中没有匹配的异常,则程序会跳出当前的函数

  • 在函数的调用处,如果没有捕获住异常,则直接跳转到更高一层的调用者

  • 如果一直没有捕获该异常,C++将会使用默认的异常处理函数

    • p 该处理函数可能会让程序最终跳出main函数并导致程序异常终止

7)C++标准的异常

8)异常的说明

相关文章:

C++高级编程(8)

八、标准IO库 1.输入输出流类 1)非格式化输入输出 2)put #include <iostream> #include <string> ​ using namespace std; int main() {string str "123456789";for (int i str.length() - 1; i > 0; i--) {cout.put(str[i]); //从最后一个字符开…...

AUTOSAR_EXP_ARAComAPI的7章笔记(2)

☞返回总目录 相关总结&#xff1a;服务发现实现策略总结 7.2 服务发现的实现策略 如前面章节所述&#xff0c;ara::com 期望产品供应商实现服务发现的功能。服务发现功能基本上是在 API 级别通过 FindService、OfferService 和 StopOfferService 方法定义的&#xff0c;协议…...

【C++】 C++游戏设计---五子棋小游戏

1. 游戏介绍 一个简单的 C 五子棋小游戏 1.1 游戏规则&#xff1a; 双人轮流输入下入点坐标横竖撇捺先成五子连线者胜同一坐标点不允许重复输入 1.2 初始化与游戏界面 初始化界面 X 输入坐标后 O 输入坐标后 X 先达到胜出条件 2. 源代码 #include <iostream> #i…...

仿RabitMQ 模拟实现消息队列项目开发文档2(个人项目)

项目需求分析 核心概念 现在需要将这个项目梳理清楚了&#xff0c;便于之后的代码实现。项目中具有一个生产消费模型&#xff1a; 其中生产者和消费者的个数是可以灵活改变的&#xff0c;让系统资源更加合理的分配。消息队列的主逻辑和上面的逻辑基本一样&#xff0c;只不过我…...

李佳琦回到巅峰背后,双11成直播电商分水岭

时间倏忽而过&#xff0c;又一年的双11即将宣告结束。 从双11正式开始前的《新所有女生的offer》&#xff0c;到被作为“比价”标杆被其他平台直播间蹭、被与其他渠道品牌比较&#xff0c;再到直播间运营一时手快多发了红包……整个双11周期下来&#xff0c;李佳琦直播间在刷新…...

云计算在教育领域的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 云计算在教育领域的应用 云计算在教育领域的应用 云计算在教育领域的应用 引言 云计算概述 定义与原理 发展历程 云计算的关键技…...

C语言 | Leetcode C语言题解之第543题二叉树的直径

题目&#xff1a; 题解&#xff1a; typedef struct TreeNode Node;int method (Node* root, int* max) {if (root NULL) return 0;int left method (root->left, max);int right method (root->right, max);*max *max > (left right) ? *max : (left right);…...

6、If、While、For、Switch

6、If、While、For、Switch 一、If 1、if-else if (boolean) {代码块 } else if (boolean) {代码块 } else if (boolean) {代码块 } else { // 默认情况代码块 }关于IDEA单元测试控制台不能输入数据的问题&#xff1a; https://blog.csdn.net/m0_72900498/article/details/…...

萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?

随着智慧城市和数字化转型的推进&#xff0c;视频监控系统已成为保障公共安全、提升管理效率的重要工具。特别是在大中型项目中&#xff0c;跨区域的网络化视频监控需求日益增长&#xff0c;这要求视频监控管理平台不仅要具备强大的视频资源管理能力&#xff0c;还要能够适应多…...

【多线程】线程池如何知道一个线程的任务已经完成

目录 1. 说明2. 任务的生命周期3. 状态更新4. 线程间的协作5. 内部数据结构6. 回调与通知7. 线程池的关闭与清理 1. 说明 1.线程池通过一系列内部机制来知道一个线程的任务已经完成。2.这些机制主要涉及任务的生命周期管理、状态更新以及线程间的协作。 2. 任务的生命周期 1…...

Transformer介绍(一)

Transformer是一种特殊的神经网络&#xff0c;一种机器学习模型。 谷歌在2017年推出的原版Transformer&#xff0c;论文《Attention Is All You Need》&#xff0c;专注于将一种语言的文本翻译成另一种。 而我们要关注的Transformer变种&#xff0c;即构建ChatGPT等工具的模型…...

[CKS] TLS Secrets创建与挂载

目前的所有题目为2024年10月后更新的最新题库&#xff0c;考试的k8s版本为1.31.1 BackGround 您必须使用存储在TLS Secret中的SSL文件&#xff0c;来保护Web 服务器的安全访问。 Task 在clever-cactus namespace中为名为clever-cactus的现有Deployment创建名为clever-cactu…...

java双向链表解析实现双向链表的创建含代码

双向链表 一.双向链表二.创建MyListCode类实现双向链表创建一.AddFirst创建&#xff08;头插法&#xff09;二.AddLast创建&#xff08;尾叉法&#xff09;三.size四.remove(指定任意节点的首位删除)五.removeAll(包含任意属性值的所有删除)六.AddIndex(给任意位置添加一个节点…...

【Kafka-go】golang的kafka应用

网络上关于go的Kafka还是比较少的今天就先出一篇入门级别的&#xff0c;之后再看看能能出一个公司业务场景中的消息流。 一、下载github.com/segmentio/kafka-go包 go get github.com/segmentio/kafka-go二、建立kafka连接 正常来说下面的配置host topic partition 应该写在…...

redis:set集合命令,内部编码,使用场景

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言命令SADDSMEMBERSSISMEMBERSCARDSPOPSMOVESREM集合间操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 内部编码使用场景总结 前言…...

45期代码随想录算法营总结

代码随想录训练营总结与收获 在为期60天的代码随想录训练营结束后&#xff0c;我感慨良多。这段时间不仅让我在编程技能上有了明显的提升&#xff0c;更让我在学习习惯和时间管理上有了深刻的反思和改变。 报名参加这个训练营对我来说是一个重要的监督机制。之前我总是拖延&a…...

深入理解Java中的instanceof关键字及接口新特性:方法实现的可能性

目录 引言 1. 什么是instanceof关键字&#xff1f; 1.1 语法结构 1.2 instanceof的用法示例 1.3 instanceof的应用场景 2. Java中的接口能包含方法实现吗&#xff1f; 2.1 默认方法&#xff08;Default Method&#xff09; 2.2 静态方法&#xff08;Static Method&…...

【python中如果class没有self会怎行】

python中如果class没有self会怎样TOC 在Python中&#xff0c;self是一个约定俗成的名称&#xff0c;用于表示类的实例。如果没有使用self&#xff0c;会导致以下问题&#xff1a; 1、无法访问实例属性&#xff1a; 在类的方法中&#xff0c;如果没有self&#xff0c;方法将无…...

【算法】(Python)动态规划

动态规划&#xff1a; dynamic programming。"programming"指的是一种表格法&#xff0c;而非编写计算机程序。通常解决最优化问题&#xff08;optimization problem&#xff09;。将问题拆分成若干个子问题&#xff0c;求解各子问题来得到原问题的解。适用于多阶段…...

EasyExcel 学习之 导出 “提示问题”

EasyExcel 学习之 导出 “提示问题” 现象分析解决&#xff08;伪代码&#xff09;前端 POST 实现后端实现 现象 EasyExcel 支持导出 xlsx、xls、csv 三种文件格式。在导出过程中可能发生各种异常&#xff0c;当发生异常时应该提示错误信息而非导出一个错误的文件。 分析 首…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...