[算法与数据结构][c++]:Static关键字和全局变量

Static关键字和全局变量

    • 1. 生命周期、作用域和初始化时机
    • 2. 全局变量
    • 3. Static 关键字
      • 3.1 面向过程
        • 3.1.1 静态全局变量
        • 3.1.2 静态局部变量(单例中会使用)
        • 3.1.3 静态函数
      • 3.2 面向对象
        • 3.2.1 类内静态成员变量
        • 3.2.2 类内静态成员函数
    • Reference


写在前面:

  • 如果您只是想回顾或了解一下static和全局变量的异同点,那么下面的总结将满足您的需求。

  • 如果您是一位初学者或对二者的使用模棱两可,建议您读完该篇文章,相信这一篇将解答完您对于static关键字以及全局变量的所有疑惑。

  • 如有问题或建议欢迎评论 or 私信 or Contact me:jerome.zhou@nio.com~~~

Static关键字和全局变量异同点:

  1. 存储位置:全局变量和静态变量都存储在内存的静态存储区。

  2. 生命周期:全局变量和静态变量的生命周期都是整个程序的执行期间。

  3. 作用域:

    • 全局变量:全局变量在整个程序中都是可见的,可以在任何函数中访问。
    • 静态变量:静态变量的作用域仅限于声明它的函数或文件。如果在函数内部声明静态变量,那么该静态变量只在该函数内部可见;如果在文件内部声明静态变量,那么该静态变量只在该文件内部可见。
  4. 初始化:

    • 全局变量:如果没有初始化,编译器会自动初始化为0。
    • 静态变量:如果没有初始化,编译器也会自动初始化为0。类内成员变量,需要类内声明,类外定义(定义时,可以使用默认初始化)
  5. 声明方式:

    • 全局变量:全局变量在所有函数外部声明。
    • 静态变量:在变量类型前加上关键字static来声明静态变量(可在任意位置)。
  6. 使用场景:

    • 全局变量:当需要在多个函数或文件中共享数据时,可以使用全局变量。
    • 静态变量:当需要保持变量的值在函数调用之间不变时,可以使用静态变量。

总的来说,全局变量和静态变量都有全局的生存期,但是静态变量的作用域可以是局部的,因此静态变量相对于全局变量来说,可以更好地保护数据,减少了数据被误操作的风险。


1. 生命周期、作用域和初始化时机

生命周期:变量从定义到销毁的时间范围。堆内存和栈内存章节,介绍了一下程序的内存管理,有一部分是Global Segment(全局段)负责存储静态变量和全局变量,存储在全局段的变量生命周期等于整个程序的运行时间

在这里插入图片描述

作用域 变量的可见代码区域(块作用域、函数作用域、类作用域和全局作用域)。不管是在全局还是局部声明的static变量都存放在程序的全局段,但是它的作用域却不等同于生命周期,它的作用域决定于它所被定义的位置。

从上述两点可以发现,静态变量和全局变量具有相同的全生命周期,存储在内存的静态存储区,但是二者的作用域却不尽相同。

初始化时机全局变量、文件域中的静态变量、类中的成员静态变量在main函数执行前初始化(饿汉式);局部变量中的静态变量在第一次调用时初始化(懒汉式)。

在类中声明的静态成员变量,还必须要在类外定义下才可以使用,否则会编译报错。

  • 静态成员变量不属于任何一个对象,对象的数据中不应该包含静态成员的数据。所以在定义类的时候不会给静态变量分配内存只是声明,因此就要在其他地方分配即定义。

定义与声明的区别:

  • 声明:向编译器声明(或介绍)了变量的名称,类型,或者函数及其参数类型等信息。声明并不分配存储空间。你可以多次声明同一个变量。

  • 定义:它除了向编译器声明(或介绍)了变量的名称,类型等信息外,还分配了存储空间。换句话说,定义是声明的扩展。你只能一次定义一个变量。,也可以顺便初始化。程序中变量有且只有一个定义(更能说明为什么要在类外再定义下类的静态成员变量了)。

在C++中,如果你试图多次定义同一个变量,编译器会报错。但是,你可以多次声明同一个变量,只要它在某个地方被定义过一次。

所以,所有的定义(包括变量和函数)都是声明,但并非所有的声明都是定义。

2. 全局变量

全局变量是在所有函数外部定义的变量,其作用域是从定义点开始到文件结尾。全局变量可以被任何函数访问和修改,即全局变量的生命周期是整个程序的执行期间

在C++中,全局变量的声明和使用主要有以下几点需要注意:

  1. 声明全局变量:全局变量在所有函数之外定义,通常是在程序的开头。例如:int x;

  2. 使用全局变量:在任何函数中,直接使用变量名即可访问全局变量。例如:x = 10;

  3. 如果全局变量和局部变量同名,那么在局部作用域中,局部变量会覆盖全局变量。如果想在局部作用域内访问全局变量,需要使用"::"全局作用域解析运算符。例如:::x = 20;

  4. 在一个文件中定义的全局变量,如果想在另一个文件中使用,需要在另一个文件中用关键字 extern 来声明该全局变量。例如:extern int x; 其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

  5. 尽量避免使用全局变量,因为全局变量会破坏数据的局部性,使得程序的理解和调试变得困难,同时也增加了数据的不安全性。

示例:

假设我们有两个文件,一个是main.cpp,一个是other.cpp。

在main.cpp文件中,我们定义了一个全局变量,并在main函数中使用该全局变量。

// main.cpp
#include <iostream>
#include "other.cpp"int x = 10;  // 全局变量的定义int main() {std::cout << x << std::endl;  // 使用全局变量printX(); // 其他文件使用全局变量  return 0;
}

在other.cpp文件中,我们想要使用main.cpp中定义的全局变量x,因此其他文件中需要用extern关键字声明该全局变量

// other.cpp
#include <iostream>extern int x;  // 全局变量的声明void printX() {std::cout << x << std::endl;  // 使用全局变量
}

如果我们有一个局部变量和全局变量同名,那么在这个局部作用域中,局部变量会覆盖全局变量。

// main.cpp
#include <iostream>int x = 10;  // 全局变量的定义int main() {int x = 20;  // 局部变量的定义std::cout << x << std::endl;  // 输出20,因为这里的x指的是局部变量std::cout << ::x << std::endl;  // 输出10,使用::访问全局变量return 0;
}

3. Static 关键字

接下来是static关键字,笔者按照面向过程(不引入类的概念)和面向对象(类内的static)两个角度展开static关键字的使用。

3.1 面向过程

3.1.1 静态全局变量

全局变量前,加上关键字static该变量就被定义成为一个静态全局变量(相当于限制作用域的全局变量:作用域仅为当前文件内)。

#include <iostream> 
using namespace std;void fn();
static int n; // 定义静态全局变量,默认初始化为0int main()
{n = 20; // 全局静态变量赋值fn();fn();return 0;
} void fn()
{n++;cout << n << endl;
} >>> 21
>>> 22

静态全局变量有以下特点:

  1. 全生命周期,该变量在Global Segment中分配内存;
  2. 默认初始化,未经初始化的静态全局变量会被程序自动初始化为0(自动变量的自动初始化值是随机的);
  3. 作用域有限, 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;
  4. 静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。对于一个完整的程序,在内存中的分布情况如下:【代码区】【全局数据区】【堆区】【栈区】,一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区,静态数据(即使是函数内部的静态局部变量)存放在全局数据区。自动变量一般会随着函数的退出而释放空间,而全局数据区的数据并不会因为函数的退出而释放空间。
static int n; //定义静态全局变量

改为

int n; //定义全局变量

程序照样正常运行。
定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:

  1. 静态全局变量不能被其它文件所用;
  2. 其它文件中可以定义相同名字的变量,不会发生冲突;

将上述示例代码改为如下:

#include <iostream.h> void fn();
static int n; //定义静态全局变量 int main()
{n=20;cout << n <<endl;fn();return 0} //File2 
#include <iostream.h> 
extern int n;
void fn()
{n++;cout << n << endl;
} 

编译并运行,会发现上述代码可以分别通过编译,但运行时出现错误。 这就是因为静态全局变量不能被其它文件所用,即使在其它文件中使用extern 进行声明也不行。

static int n; //定义静态全局变量

改为

int n; //定义全局变量

再次编译运行程序,程序可正常运行。

因此,在一个文件中,静态全局变量和全局变量功能相同;而在两个文件中,要使用同一个变量,则只能使用全局变量而不能使用静态全局变量。

3.1.2 静态局部变量(单例中会使用)

感兴趣的小伙伴可以看一下单例。

在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量(作用域更狭窄的全局变量:全生命周期,局部变量的作用域)。

//Example 3
#include <iostream>void fn();
void fn_local();
int main()
{fn(); //10fn(); //11fn(); //12fn_local(); //10fn_local(); //10return 0;
}void fn()
{static int n = 10;std::cout << n << std::endl;n++;
}void fn_local()
{int n = 10;std::cout << n << std::endl;n++;
}

在函数fn_local()定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。

但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来**,变量已经不再属于函数本身了,不再仅受函数的控制,**这给程序的维护带来不便。

静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

静态局部变量有以下特点:

  1. 静态局部变量在全局数据区分配内存
  2. 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
  3. 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
  4. 静态局部变量始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束
3.1.3 静态函数

在函数的返回类型前加上static关键字,函数即被定义为静态函数静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

#include <iostream>
static void fn();//声明静态函数int main()
{fn();return 0;
}void fn()//定义静态函数
{int n = 10;std::cout << n << std::endl;
}

定义静态函数的好处:(类似于静态全局变量)

  1. 静态函数不能被其它文件所用;
  2. 其它文件中可以定义相同名字的函数,不会发生冲突

3.2 面向对象

3.2.1 类内静态成员变量

在类内成员变量的声明前加上关键字static,该数据成员就是类内的静态数据成员。

#include <iostream>class Myclass
{
public:Myclass(int a, int b, int c);void GetSum();private:int a, b, c;static int Sum; // 声明静态数据成员 important!!! 此处仅进行了声明
};// 没有类对象时,作用域就可见。
int Myclass::Sum = 0; // 定义并初始化静态数据成员,类外初始化(const static 可以类内初始化)Myclass::Myclass(int a, int b, int c)
{this->a = a; // 同名变量赋值需要用this指针this->b = b;this->c = c;Sum += a + b + c;
}void Myclass::GetSum()
{std::cout << "Sum=" << Sum << std::endl;
}int main()
{Myclass M(1, 2, 3);M.GetSum();Myclass N(4, 5, 6);N.GetSum();M.GetSum();return 0;
}

静态成员变量有以下特点:

  1. 静态成员变量是该类的所有对象所共有的。对于普通成员变量,每个类对象都有自己的一份拷贝。而静态成员变量一共就一份,无论这个类的对象被定义了多少个,静态成员变量只分配一次内存,由该类的所有对象共享访问。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;
  2. 因为静态数据成员在全局数据区分配内存,由本类的所有对象共享,所以,它不属于特定的类对象,不占用对象的内存,而是在所有对象之外开辟内存,在没有产生类对象时其作用域就可见(类作用域)。因此,在没有类的实例存在时,静态成员变量就已经存在,我们就可以操作它;
  3. 静态成员变量存储在全局数据区。static 成员变量的内存空间既不是在声明类时分配,也不是在创建对象时分配,而是在定义初始化时分配静态成员变量必须初始化,而且只能在类体外进行。否则,编译能通过,链接不能通过。在示例中,语句int Myclass::Sum=0;是定义并初始化静态成员变量。初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化,一般是 0 (int Myclass::Sum;)。静态数据区的变量都有默认的初始值,而动态数据区(堆区、栈区)的变量默认是垃圾值。
  4. static 成员变量和普通 static 变量一样,编译时在静态数据区分配内存,到程序结束时才释放。这就意味着,static 成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。
  5. 静态数据成员初始化与一般数据成员初始化不同。初始化时可以不加 static,但必须要有数据类型。被 private、protected、public 修饰的 static 成员变量都可以用这种方式初始化。静态数据成员初始化的格式为:<数据类型><类名>::<静态数据成员名>=<值>
  6. 类的静态成员变量访问形式1 (类已经被实例化):<类对象名>.<静态数据成员名>
  7. 类的静态成员变量访问形式2:<类类型名>::<静态数据成员名>,也即,静态成员不需要通过对象就能访问。
  8. 静态数据成员和普通数据成员一样遵从public,protected,private访问规则;
  9. 如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员 ;
  10. sizeof 运算符不会计算 静态成员变量。
class CMyclass{int n;static int s;
};    //则sizeof(CMyclass)等于4

何时采用静态数据成员?

设置静态成员(变量和函数)这种机制的目的是将某些和类紧密相关的全局变量和函数写到类里面,看上去像一个整体,易于理解和维护。如果 想在同类的多个对象之间实现数据共享,又不要用全局变量,那么就可以使用静态成员变量。也即,静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处:

  1. 不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,节省存储空间。
  2. 一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了。

你也许会问,用全局变量不是也可以达到这个效果吗?

同全局变量相比,使用静态数据成员有两个优势:

  1. 静态成员变量没有进入程序的全局命名空间,因此不存在与程序中其它全局命名冲突的可能,不会污染命名空间。
  2. 可以实现信息隐藏。静态成员变量可以是private成员,而全局变量不能。
3.2.2 类内静态成员函数

静态成员函数为类服务而不是为某一个类的具体对象服务。静态成员函数与静态成员变量一样,都是类的内部实现,属于类定义的一部分。普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象。

普通的成员函数一般都隐含了一个 this指针(可以参见文章C++中的this指针和Python中的Self),this指针指向类的对象本身(指向实例化后的对象的地址),因为普通成员函数总是具体地属于类的某个具体对象的。当函数被调用时,系统会把当前对象的起始地址赋给 this 指针。通常情况下,this是缺省的。如函数fn()实际上是this->fn()。

与普通函数相比,静态成员函数属于类本身,而不作用于对象,因此它不具有this指针。正因为它没有指向某一个对象,所以它无法访问属于类对象的非静态成员变量和非静态成员函数,它只能调用其余的静态成员函数和静态成员变量。从另一个角度来看,由于静态成员函数和静态成员变量在类实例化之前就已经存在可以访问,而此时非静态成员还是不存在的,因此静态成员不能访问非静态成员。

#include <iostream>
using namespace std;class Student{
private:char *name;int age;float score;static int num;  	//学生人数static float total;  //总分
public:Student(char *, int, float);void say();static float getAverage();  //静态成员函数,用来获得平均成绩
};int Student::num = 0;
float Student::total = 0;Student::Student(char *name, int age, float score)
{this->name = name;this->age = age;this->score = score;num++;total += score;
}void Student::say()
{cout<<name<<"的年龄是 "<<age<<",成绩是 "<<score<<"(当前共"<<num<<"名学生)"<<endl;
}
// 类内静态成员函数,智能访问类内静态成员变量
float Student::getAverage()
{return total / num;
}int main()
{(new Student("小明", 15, 90))->say();(new Student("李磊", 16, 80))->say();(new Student("张华", 16, 99))->say();(new Student("王康", 14, 60))->say();cout<<"平均成绩为 "<<Student::getAverage()<<endl;return 0;
}>>> 小明的年龄是 15,成绩是 90(当前共1名学生)
李磊的年龄是 16,成绩是 80(当前共2名学生)
张华的年龄是 16,成绩是 99(当前共3名学生)
王康的年龄是 14,成绩是 60(当前共4名学生)
平均成绩为 82.25

静态成员函数的特点:

  1. 出现在类外的函数定义时不能指定关键字static;
  2. 静态成员之间可以相互访问,即静态成员函数(仅)可以访问静态成员变量、静态成员函数、静态变量;
  3. 静态成员函数不能访问非静态成员函数和非静态成员变量;
  4. 非静态成员函数可以任意地访问静态成员函数和静态数据成员
  5. 由于没有this指针的额外开销,静态成员函数与类的全局函数相比速度上会稍快;
  6. 调用静态成员函数,两种方式:
  • 通过成员访问操作符(.)和(->),也即通过类对象或指向类对象的指针调用静态成员函数。
  • 直接通过类来调用静态成员函数。<类名>::<静态成员函数名>(<参数表>)。也即,静态成员不需要通过对象就能访问。

Reference

https://zhuanlan.zhihu.com/p/37439983

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/612679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Taro+vue3 实现选座位 功能 以及座位显示

1.类似选座位那种功能 我的功能座位 不是html元素 而是 座位图片 都是图片 const onConfirm () > {// const area_arr selectedSeat.value.map((item) > {// return item.areaId;// });// const abc isRepeat(area_arr);// if (!abc) {// Taro.showToast({//…

水经微图安卓版APP正式上线!

在水经微图APP&#xff08;简称“微图APP”&#xff09;安卓版已正式上线&#xff01; 在随着IOS版上线约一周之后&#xff0c;安卓版终于紧随其后发布了。 微图安卓版APP下载安装 自从IOS版发布之后&#xff0c;就有用户一直在问安卓版什么时候发布&#xff0c;这里非常感谢…

Windows下安装mariadb10.5数据库及配置详细教程

1、简介 MariaDB数据库管理系统是一款MySQL的替代数据库。MariaDB由MySQL的创始人麦克尔维德纽斯主导开发&#xff0c;是可扩展的&#xff0c;可靠的SQL服务器的合乎逻辑的选择&#xff0c;MariaDB 10.5 是 MariaDB 当前的稳定系列。 2、下载 下载地址&#xff1a;Download M…

基于ssm快餐店点餐结算系统的设计与实现+vue论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装快餐店点餐结算系统软件来发挥其高效地信息处理的作用&…

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测 目录 区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CNN-LSTM-KDE多变量时间序列区…

使用 Windbg 分析软件异常时的诸多细节与技巧总结

目录 1、dump文件 1.1、dump文件的生成方式 1.2、dump文件的大小 2、pdb符号文件 2.1、pdb文件的路径设置 2.2、pdb文件的时间戳与名称问题 2.3、如何确定要找哪些pdb文件&#xff1f; 3、使用Windbg静态分析dump文件以及动态调试程序的一般步骤 4、确定发生异常或崩溃…

buuctf[极客大挑战 2019]BabySQL--联合注入、双写过滤

目录 1、测试万能密码&#xff1a; 2、判断字段个数 3、尝试联合注入 4、尝试双写过滤 5、继续尝试列数 6、查询数据库和版本信息 7、查询表名 8、没有找到和ctf相关的内容&#xff0c;查找其他的数据库 9、查看ctf数据库中的表 10、查询Flag表中的字段名 11、查询表…

Python图像处理【17】指纹增强和细节提取

指纹增强和细节提取 0. 前言1. 形态学操作基础2. 利用形态学操作进行指纹增强3. 从增强指纹中提取特征(细节)3.1 指纹细节概念3.2 提取指纹细节 小结系列链接 0. 前言 指纹识别和验证是最古老&#xff0c;最流行和广泛使用的生物特征技术。众所周知&#xff0c;每个人都有独特…

模型\视图一般步骤:为什么经常要用“选择模型”QItemSelectionModel?

一、“使用视图”一般的步骤&#xff1a; //1.创建 模型(这里是数据模型&#xff01;) tabModelnew QSqlTableModel(this,DB);//数据表 //2.设置 视图的模型(这里是数据模型&#xff01;) ui->tableView->setModel(tabModel); 模型种类&#xff1a; QStringListModel…

SemiDrive E3 打包说明

一、 概述 本文介绍 E3 PAC 打包&#xff0c;编译器生成 bin 文件需要通过打包生成 PAC 包&#xff0c;再通过 SDToolBox 工具将 PAC 包烧写到芯片&#xff0c;PAC 包的物理载体分为 Flash、eMMC、SD&#xff0c;一个 PAC包最多支持 3 个BootPackage&#xff1b;本文主要描述打…

iOS 应用上架指南:资料填写及提交审核

摘要 本文提供了iOS新站上架资料填写及提交审核的详细指南&#xff0c;包括创建应用、资料填写-综合、资料填写-IOS App和提交审核等步骤。通过本指南&#xff0c;您将了解到如何填写正确的资料&#xff0c;并顺利通过苹果公司的审核。 引言 在开发iOS应用后&#xff0c;将其…

医院里的管家婆,如何才能把科室的设备设施管理好?

在医院的各个科室中&#xff0c;有一位不可或缺的重要角色&#xff0c;科室的“管家婆”&#xff0c;大事、小事&#xff0c;事事都归她管&#xff0c;她就是护士长。她不仅是护理工作的核心&#xff0c;更是科室设备设施的“管家婆”。管理众多设备和资产&#xff0c;确保其正…

ArcMap实现多行标注

地图标注是地图的重要组成部分&#xff0c;也是地理信息的重要表达方式​。ArcMap的符号化系统为我们添加地图标注提供了方便&#xff0c;但是有时我们却需要添加多行标注&#xff0c;今天我们一起来探索一下ArcMap中两行标注的实现方式​。 首先&#xff0c;我们右击目标图层…

Oracle-探究统计信息收集自动采样AUTO_SAMPLE_SIZE

前言&#xff1a; Oracle数据库进行统计信息收集时&#xff0c;可以通过ESTIMATE_PERCENT参数指定采样方式或者比例&#xff0c;有以下4种指定的方式 1 统计信息收集时不指定值&#xff0c;这时候ESTIMATE_PERCENT值为默认值DBMS_STATS.AUTO_SAMPLE_SIZE&#xff0c;自动采样 …

TXB2 ELISA kit—Enzo Life Sciences ELISA试剂盒

高灵敏、经过充分验证的ELISA试剂盒&#xff0c;3小时内即可得结果 血栓素A2&#xff08;TXA2&#xff09;参与血小板聚集、血管收缩和生殖功能&#xff0c;但在生理条件下的半衰期仅有37秒。血栓素B2&#xff08;TXB2&#xff09;是TXA2非酶水合的稳定产物&#xff0c;因此体内…

Kafka之集群搭建

1. 为什么要使用kafka集群 单机服务下&#xff0c;Kafka已经具备了非常高的性能。TPS能够达到百万级别。但是&#xff0c;在实际工作中使用时&#xff0c;单机搭建的Kafka会有很大的局限性。 ​ 消息太多&#xff0c;需要分开保存。Kafka是面向海量消息设计的&#xff0c;一个T…

数字化转型助力保险业腾飞,国产化安全产品护航高质量发展

近几年&#xff0c;全球贸易和经济受到了巨大冲击&#xff0c;众多贸易企业经营环境面临困难&#xff0c;某保险公司为国内企业提供强有力的保险保障&#xff0c;大大减轻了企业在国际贸易中风险&#xff0c;为国家经济恢复起到关键的作用。2022年&#xff0c;该保险公司承保金…

麒麟Linux安装新版微信的方法

麒麟Linux系统目前有v10和v10sp1&#xff0c;注意&#xff0c;恶趣味的是v10和v10sp1竟然不通用&#xff0c;这导致了一些国产程序出现运行bug,通过系统自带的麒麟商店无法图形界面安装&#xff0c;甚至搜索不到微信等等一系列问题&#xff0c;易用度确实很差。 解决办法也很简…

【一周年创作总结】人生是远方的无尽旷野呀

那一眼瞥见的伟大的灵魂&#xff0c;却似模糊的你和我 文章目录 &#x1f4d2;各个阶段的experience&#x1f50e;大一寒假&#x1f50e;大一下学期&#x1f50e;大一暑假&#x1f50e;大二上学期&#xff08;现在&#xff09; &#x1f354;相遇CSDN&#x1f6f8;自媒体&#…

Go gin框架控制器接收文件

1. 限定文件参数名&#xff08;一般做法&#xff09; func FileController(c *gin.Context) {//取表单中namefile的文件fileHeader, err : c.FormFile("file")//_, fileHeader, err : c.Request.FormFile("file")//这种也行if err ! nil {log.Println(err…