java开发需要掌握的maven相关知识和Junit单元测试

maven简介


    什么是maven:


        maven是一款管理和构建java项目的工具,是apache旗下的一个开源项目。


    maven的作用:

        依赖管理:


            方便快捷的管理项目依赖的资源(jar包)。


        项目构建:


            标准化的跨平台(Linux,windows,macOs)的自动化项目构建方式。
      

 统一项目结构:


            提供标准,统一的项目结构。


    maven概述:

        仓库:

用于存储资源,管理各种jar包


            本地仓库:自己计算机上的一个目录
            中央仓库:由maven团队维护的全球唯一的。仓库地址(https://repo1.maven.org/maven2/)
            远程仓库(私服):一般由公司团队搭建的私有仓库



        安装:

  • 1,解压  apache-maven-3.9.4-bin.zip
  • 2,配置本地仓库:创建一个本地仓库文件夹
  • 3,修改 conf/settings.xml 中的 <localRepository> 为一个指定目录
  • 4,配置阿里云私服:修改 conf/settings.xml 中的 <mirrors> 标签,为其添加如下子标签

                <mirror>  
                        <id>alimaven</id>  
                        <name>aliyun maven</name>  
                        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                        <mirrorOf>central</mirrorOf>          
        </mirror>

  • 5,指定jdk版本

   <profile>
    <id>jdk-21</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>21</jdk>
    </activation>
    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <maven.compiler.compilerVersion>21</maven.compiler.compilerVersion>
    </properties>
</profile>

  • 6,配置环境变量: MAVEN_HOME 为maven的解压目录,并将其bin目录加入PATH环境变量

第一步:解压

第二步:创建本地仓库

 第三步:修改conf/settings.xml

第四步:配置阿里云私服

 第五步:指定jdk版本

第六步:配置环境变量  MAVEN_HOME

 

 在path里面配置bin

测试:window+r 输入mvn -v

能看见版本信息就代表成功 

IDEA集成maven

第一步:close Project

第二步:点击 customize 右下角的 All settings

第三步:点击 Build,Exception,Depliyment下面的Build Tools下面的maven进行配置

第四步:点击 Build,Exception,Depliyment下面的Build Tools下面的Runner 进行配置

 

第五步:点击 Build,Exception,Depliyment下面的 Compiler里面的java Compiler

 现在IDEA已经集成maven了


        创建maven项目:

                第一步:先创建一个空项目

                

第二步:点击在右上角的设置。找到Project Structure

 第三步:在project里面设置jdk版本

导入模块:

第一步:在新创建的工程右击,

第二步:选择 new Module 

第三步:导入module

第二步选择要导入的模块:

 第三步:选择 import module

 

第四步:点击pom.xml添加:

第二种方式导入模块:

还是点击pom.xml

移除模块:

第一步:点击要移除的module右击

第二步:在compiler.xml删除缓存文件


        maven坐标:

            什么是坐标?

  •    maven中的坐标是资源(jar)包的唯一标识,通过该坐标可以唯一定位资源位置。
  •     使用坐标来定义项目或者引入项目中需要的依赖。
  •             maven坐标主要组成

                groupId:定义当前maven项目隶属组织名称(通常是域名反写,例如:com.baidu)
                artifactId:定义当前maven项目名称(通常是模块名称,例如 user-service、user-service)

  •                 version:定义当前项目版本号

                    SNAPAHOT:功能不稳定,处于开发中的版本,即快照版本
                    RELEASE:功能趋于稳定,当前更新停止,可以用于发行版本。


      
        依赖配置:


            依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。
            配置:
                1,在pom.xml中编写<dependencies>标签
                2,在<dependencies>标签中使用<dependcy>引入坐标
                3,定义坐标的groupId,artifiactId,version
                4,点击刷新按钮,引入最新的加入的坐标

示例:


        依赖传递:


            直接依赖:在当前项目中通过依赖配置建立的依赖关系
            间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

            排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本。

 这样点就出来了

 

排除依赖


        生命周期:


            maven中有三套相互独立的生命周期
                clean:清理工作
                default:核心工作,如:编译,打包,测试,安装,部署
                site:生成报告,发布站点

clean操作: 把已经编译好的target目录删除

compile操作:编译项目,出现target文件

test:单元测试:

package打包:在target里面会出现一个jar包

install:把项目打包到本地仓库


        依赖范围:


            依赖范围的jar包:默认情况下,可以在任何地方使用。可以通过<scope>设置其作用范围。
            作为范围:
                主程序范围有效。(main文件夹范围内)

                测试程序范围有效。(test文件夹范围内)

                是否参与打包运行。(package指令范围内)

    单元测试:


        测试概述:


            是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。
            阶段划分:单元测试、集成测试、系统测试、验收测试。

            测试方法:白盒测试、黑盒测试 及 灰盒测试。

        快速入门:单元测试:就是针对最小的功能单元(方法),编写测试代码对其正确性进行测试。
JUnit:最流行的Java测试框架之一,提供了一些功能,方便程序进行单元测试(第三方公司提供)。

            使用步骤:


                1,在pom.xml中,引入Junit的依赖
                2,在test/java目录下,创建测试类,并编写对应的测试方法,并在方法上声明@Test注解。
                3,运行单元测试 (测试通过:绿色;测试失败:红色)。

        常见注解:


            @Test:测试类中的方法用它修饰才能成为测试方法,才能启动执行

            @BeforeEach:用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。
            @AfterEach:用来修饰一个实例方法,该方法会在每一个方法执行之后执行。
            @BeforeAll:用来修饰静态方法,该方法会在所有测试方法执行之前只执行一次。
            @AfterAll:用来修饰一个静态方法,该方法会在所有实例方法之前只会执行一次。
            @ParameterizedTest:参数化测试的注解 (可以让单个测试运行多次,每次运行时仅参数不同)

            @ValueSource:参数化测试的参数来源,赋予测试方法参数

            @DisplayName:指定测试类、测试方法显示的名称 (默认为类名、方法名)

代码示例1:

package com.sde.test.test2;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

@DisplayName("用户相关的测试")
public class UserService1Test {
    private final String card1 = "610110201909091231";
    private final String card2 = "110110201509091109";
    private final String card3 = "510310198812120931";

    /**
     * 测试是否是北京
     */
    @DisplayName("测试是否是北京地区")
    @Test
    public void testIsBeijing(){
        boolean flag1 = new UserService().isBeijing(card1);
        boolean flag2 = new UserService().isBeijing(card2);
        boolean flag3 = new UserService().isBeijing(card3);
        System.out.println(flag1);
        System.out.println(flag2);
        System.out.println(flag3);
    }

    /**
     * 测试年龄
     */
    @DisplayName("测试用户的年龄")
    @Test
    public void testGetAge(){
        Integer age1 = new UserService().getAge(card1);
        Integer age2 = new UserService().getAge(card2);
        Integer age3 = new UserService().getAge(card3);
        System.out.println(age1);
        System.out.println(age2);
        System.out.println(age3);
    }

    /**
     * 测试性别
     */
    @DisplayName("测试用户的性别")
    @Test
    public void testGetGender(){
        String gender1 = new UserService().getGender(card1);
        String gender2 = new UserService().getGender(card2);
        String gender3 = new UserService().getGender(card3);
        System.out.println(gender1);
        System.out.println(gender2);
        System.out.println(gender3);
    }

    /**
     * 测试出生年份
     */
    @DisplayName("测试出生年份")
    @Test
    public void testYear(){
        String year1 = new UserService().getYear(card1);
        String year2 = new UserService().getYear(card2);
        String year3 = new UserService().getYear(card3);
        System.out.println(year1);
        System.out.println(year2);
        System.out.println(year3);
    }

    /**
     * 测试出生月份
     */
    @DisplayName("测试出生月份")
    @Test
    public void testGetMonth(){
        String month1 = new UserService().getMonth(card1);
        String month2 = new UserService().getMonth(card2);
        String month3 = new UserService().getMonth(card3);
        System.out.println(month1);
        System.out.println(month2);
        System.out.println(month3);
    }

}

测试案例2:

package com.sde.test.test2;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

@DisplayName("用户相关的测试")
public class UserService2Test {

    @DisplayName("测试是否是北京地区")
    @ParameterizedTest
    @ValueSource(strings = {"610110201909091231","110110201509091109","510310198812120931"})
    public void testIsBeijing(String cardId){
        boolean b = new UserService().isBeijing(cardId);
        System.out.println(b);
    }

    @DisplayName("测试用户的年龄")
    @ParameterizedTest
    @ValueSource(strings = {"610110201909091231","110110201509091109","510310198812120931"})
    public void testGetAge(String cardId){
        Integer age = new UserService().getAge(cardId);
        System.out.println(age);
    }

    @DisplayName("测试用户的性别")
    @ParameterizedTest
    @ValueSource(strings = {"610110201909091231","110110201509091109","510310198812120931"})
    public void testGetGender(String cardId){
        String gender = new UserService().getGender(cardId);
        System.out.println(gender);
    }

    @DisplayName("测试出生年份")
    @ParameterizedTest
    @ValueSource(strings = {"610110201909091231","110110201509091109","510310198812120931"})
    public void testGetYear(String cardId){
        String year = new UserService().getYear(cardId);
        System.out.println(year);
    }

    @DisplayName("测试出生月份")
    @ParameterizedTest
    @ValueSource(strings = {"610110201909091231","110110201509091109","510310198812120931"})
    public void testGetMonth(String cardId){
        String month = new UserService().getMonth(cardId);
        System.out.println(month);
    }

}

案例3:

package com.sde.test.test2;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

@DisplayName("用户相关的测试")
public class UserServer3Test {
    private final String card1 = "610110201909091231";
    private final String card2 = "110110201509091109";
    private final String card3 = "510310198812120931";

    /**
     * 测试是否是北京
     */
    @DisplayName("测试是否是北京地区")
    @Test
    public void testIsBeijing(){
        boolean flag1 = new UserService().isBeijing(card1);
        boolean flag2 = new UserService().isBeijing(card2);
        boolean flag3 = new UserService().isBeijing(card3);
        System.out.println(flag1);
        System.out.println(flag2);
        System.out.println(flag3);
        Assertions.assertFalse(flag1);
        Assertions.assertTrue(flag2);
        Assertions.assertFalse(flag3);
    }

    /**
     * 测试年龄
     */
    @DisplayName("测试用户的年龄")
    @Test
    public void testGetAge(){
        Integer age1 = new UserService().getAge(card1);
        Integer age2 = new UserService().getAge(card2);
        Integer age3 = new UserService().getAge(card3);
        System.out.println(age1);
        System.out.println(age2);
        System.out.println(age3);
        Assertions.assertEquals(4,age1,"4岁");
        Assertions.assertEquals(8,age2,"8岁");
        Assertions.assertEquals(34,age3,"34岁");
    }

    /**
     * 测试性别
     */
    @DisplayName("测试用户的性别")
    @Test
    public void testGetGender(){
        String gender1 = new UserService().getGender(card1);
        String gender2 = new UserService().getGender(card2);
        String gender3 = new UserService().getGender(card3);
        System.out.println(gender1);
        System.out.println(gender2);
        System.out.println(gender3);
        Assertions.assertEquals("男",gender1,"男");
        Assertions.assertEquals("女",gender2,"女");
        Assertions.assertEquals("男",gender3,"男");
    }

    /**
     * 测试出生年份
     */
    @DisplayName("测试出生年份")
    @Test
    public void testYear(){
        String year1 = new UserService().getYear(card1);
        String year2 = new UserService().getYear(card2);
        String year3 = new UserService().getYear(card3);
        System.out.println(year1);
        System.out.println(year2);
        System.out.println(year3);
        Assertions.assertEquals("2019",year1,"2019");
        Assertions.assertEquals("2015",year2,"2015");
        Assertions.assertEquals("1988",year3,"1988");
    }

    /**
     * 测试出生年份
     */
    @DisplayName("测试出生月份")
    @Test
    public void testGetMonth(){
        String month1 = new UserService().getMonth(card1);
        String month2 = new UserService().getMonth(card2);
        String month3 = new UserService().getMonth(card3);
        System.out.println(month1);
        System.out.println(month2);
        System.out.println(month3);
        Assertions.assertEquals("09",month1,"09");
        Assertions.assertEquals("09",month2,"09");
        Assertions.assertEquals("12",month3,"12");
    }
}

        断言:


            assertEquals(Object exp, Object act, String msg)---检查两个值是否相等,不相等就报错。


            assertNotEquals(Object unexp, Object act, String msg)---检查两个值是否不相等,相等就报错。

            assertNull(Object act, String msg):---    检查对象是否为null,不为null,就报错。
            assertNotNull(Object act, String msg)---检查对象是否不为null,为null,就报错。

            assertTrue(boolean condition, String msg)---检查条件是否为true,不为true,就报错。

            assertFalse(boolean condition, String msg)---检查条件是否为false,不为false,就报错。

            assertSame(Object exp, Object act, String msg)---检查两个对象引用是否相等,不相等,就报错。

案例:

package com.sde.test.test2;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

@DisplayName("用户相关的测试")
public class UserServer3Test {
    private final String card1 = "610110201909091231";
    private final String card2 = "110110201509091109";
    private final String card3 = "510310198812120931";

    /**
     * 测试是否是北京
     */
    @DisplayName("测试是否是北京地区")
    @Test
    public void testIsBeijing(){
        boolean flag1 = new UserService().isBeijing(card1);
        boolean flag2 = new UserService().isBeijing(card2);
        boolean flag3 = new UserService().isBeijing(card3);
        System.out.println(flag1);
        System.out.println(flag2);
        System.out.println(flag3);
        Assertions.assertFalse(flag1);
        Assertions.assertTrue(flag2);
        Assertions.assertFalse(flag3);
    }

    /**
     * 测试年龄
     */
    @DisplayName("测试用户的年龄")
    @Test
    public void testGetAge(){
        Integer age1 = new UserService().getAge(card1);
        Integer age2 = new UserService().getAge(card2);
        Integer age3 = new UserService().getAge(card3);
        System.out.println(age1);
        System.out.println(age2);
        System.out.println(age3);
        Assertions.assertEquals(4,age1,"4岁");
        Assertions.assertEquals(8,age2,"8岁");
        Assertions.assertEquals(34,age3,"34岁");
    }

    /**
     * 测试性别
     */
    @DisplayName("测试用户的性别")
    @Test
    public void testGetGender(){
        String gender1 = new UserService().getGender(card1);
        String gender2 = new UserService().getGender(card2);
        String gender3 = new UserService().getGender(card3);
        System.out.println(gender1);
        System.out.println(gender2);
        System.out.println(gender3);
        Assertions.assertEquals("男",gender1,"男");
        Assertions.assertEquals("女",gender2,"女");
        Assertions.assertEquals("男",gender3,"男");
    }

    /**
     * 测试出生年份
     */
    @DisplayName("测试出生年份")
    @Test
    public void testYear(){
        String year1 = new UserService().getYear(card1);
        String year2 = new UserService().getYear(card2);
        String year3 = new UserService().getYear(card3);
        System.out.println(year1);
        System.out.println(year2);
        System.out.println(year3);
        Assertions.assertEquals("2019",year1,"2019");
        Assertions.assertEquals("2015",year2,"2015");
        Assertions.assertEquals("1988",year3,"1988");
    }

    /**
     * 测试出生年份
     */
    @DisplayName("测试出生月份")
    @Test
    public void testGetMonth(){
        String month1 = new UserService().getMonth(card1);
        String month2 = new UserService().getMonth(card2);
        String month3 = new UserService().getMonth(card3);
        System.out.println(month1);
        System.out.println(month2);
        System.out.println(month3);
        Assertions.assertEquals("09",month1,"09");
        Assertions.assertEquals("09",month2,"09");
        Assertions.assertEquals("12",month3,"12");
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20 章 多线程

20.1线程简介. 20.2创建线程 2.1继承Thread类 Thread 类是java.lang包中的一个类&#xff0c;从这个类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建立Thread 实例。Thread类中常用的两个构造方法如下: public Thread():创建一个新的线程对象。 public Thre…

【LeetCode】128. 最长连续序列——哈希的应用(3)

文章目录 1、思路2、解题方法3、复杂度时间复杂度:空间复杂度: 4、Code Problem: 128. 最长连续序列 1、思路 我会用一种做题者的思路来去看待这道题。 我们在乍一看到这道题的时候&#xff0c;看到它的时间复杂度要求为O(N)&#xff0c;然后又要求去找序列(就是让你判断这个…

stm32 TIM

一、TIM简介 TIM&#xff08;Timer&#xff09;定时器定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断。16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时定时器不仅具备基本的定时中断功能&…

前端 | iframe框架标签应用

文章目录 &#x1f4da;嵌入方式&#x1f4da;图表加载显示&#x1f4da;100%嵌入及滑动条问题&#x1f4da;加载动画保留 前情提要&#xff1a; 计划用iframe把画好的home1.html&#xff08;echarts各种图表组成的html数据大屏&#xff09;嵌入整合到index.html&#xff08;搭…

只需十分钟快速入门Python,快速了解基础内容学习。零基础小白入门适用。

文章目录 简介特点搭建开发环境版本hello world注释文件类型变量常量数据类型运算符和表达式控制语句数组相关函数相关字符串相关文件处理对象和类连接mysql关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源…

摇滚史密斯2014重置版外接声卡

摇滚史密斯2014重置版外接声卡 前提 由于rs_asio是通过模拟原厂线的方法来使游戏可以支持声卡的&#xff0c;因此&#xff0c;声卡的采样频率需要满足原厂线要求&#xff0c;即采样率可以设置为 48000 Hz。 我使用的是 Sonic Cube 这款声卡&#xff0c;非常幸运&#xff0c;…

汽车电子 -- 车载ADAS之FCW(前方碰撞预警)

相关法规文件: FCW: GB∕T 33577-2017 智能运输系统 车辆前向碰撞预警系统 性能要求和测试规程 一、前方碰撞预警 FCW&#xff08; Forward Collision Warning&#xff09; 参看&#xff1a;法规标准-GB/T 33577标准解读(2017版) 1、状态机 系统关闭 当车辆前向碰撞预警系…

unity学习笔记07

一、组件 有几个物体他们之间有着重复的功能&#xff0c;该如何避免重复的去写代码&#xff1f; 可以将一些相同的功能写成一个组件&#xff0c;也就是组件就等同于功能。 什么是组件&#xff1f; 在Unity中&#xff0c;游戏物体是不具备任何功能的&#xff0c;如果想要为其…

香港科技大学数据建模(MSc DDM)硕士学位项目(2024年秋季入学)招生宣讲会-武汉专场

时间&#xff1a;2023 年12 月 8 日&#xff08;周五&#xff09; 15:00 地点&#xff1a;华中科技大学大学生活动中心B座303 嘉宾教授&#xff1a;张锐 教授 项目旨在培养科学或工程背景的学员从数据中提取信息的数据建模能力&#xff0c;训练其拥有优秀的解难和逻辑思考与分…

3.OpenResty系列之Nginx反向代理

1. Nginx简介 Nginx (engine x) 是一款轻量级的 Web 服务器 、反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器 什么是反向代理&#xff1f; 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受 internet 上的连接请求&#x…

金山办公前端二面

1. react 和 vue的区别 还有jquery&#xff1f; &#xff08;1&#xff09; jquery 和 vue、react 的区别&#xff1a; vue 和 react : 数据和视图分离 以数据驱动视图&#xff0c;只关心数据变化 dom 操作被封装&#xff08;数据驱动&#xff09; jquery&#xff1a;依靠 do…

python环境的搭建+pytharm安装教程

一、Anaconda安装 1、去官网下载anaconda >百度搜索anaconda按回车键 >找到官网地址进去&#xff08;注意看网址&#xff09; >下载位置 2、安装anaconda 具体就安装步骤就不演示了&#xff08;写文章时已经安装好了&#xff09; 二、pycharm安装 1、去官网下载py…

Redis 基本命令—— 超详细操作演示!!!

内存数据库 Redis7—— Redis 基本命令 三、Redis 基本命令&#xff08;下&#xff09;3.8 benchmark 测试工具3.9 简单动态字符串SDS3.10 集合的底层实现原理3.11 BitMap 操作命令3.12 HyperLogLog 操作命令3.13 Geospatial 操作命令3.14 发布/订阅命令3.15 Redis 事务 四、Re…

【C语言加油站】函数栈帧的创建与销毁 #保姆级讲解

函数栈帧的创建与销毁 导言一、计算机硬件1.冯•诺依曼机基本思想2.冯•诺依曼机的特点&#xff1a;3.存储器3.1 分类3.2 内存的工作方式3.3 内存的组成 4.寄存器4.1 基本含义4.2 寄存器的功能4.3 工作原理4.4 分类4.4.1 通用寄存器组AX(AH、AL)&#xff1a;累加器BX(BH、BL)&a…

第七节HarmonyOS UIAbility生命周期以及启动模式

一、UIAbility生命周期 为了实现多设备形态上的裁剪和多窗口的可扩展性&#xff0c;系统对组件管理和窗口管理进行了解耦。UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态&#xff0c;WindowStageCreate和WindowStageDestroy为窗口管理器&#xff08…

堆结构的应用:随时取得数据流中的中位数

大根堆和小根堆配合 实现 第一个数字直接入大根堆 对于后面的数字&#xff0c; 如果数字 < 大根堆的堆顶&#xff0c;这个数字入大根堆 否则入小根堆 在数字入堆的同时&#xff0c;进行大根堆与小根堆的大小的比较&#xff0c;一旦它们两个的大小之差 2&#xff0c;较大…

【浅尝C++】C++类的6大默认成员函数——构造、析构及拷贝构造函数

&#x1f388;归属专栏&#xff1a;浅尝C &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;记录一句&#xff1a;好想摆烂&#xff0c;又好想学习~~ 文章前言&#xff1a;本篇文章简要介绍C类的构造函数、析构函数及拷贝构造函数&#xff0c;介绍每个小点时&#xf…

java+python农村集体产权管理系统php+vue

注册、登陆该系统根据操作权限的不同分为管理员和用户两种&#xff0c;新用户在登陆前要进行用户注册&#xff0c;注册完成后方可进行登陆。 本次设计的关键问题处理&#xff0c;主要有如下几点&#xff1a; (1&#xff09;本次开发&#xff0c;采用主流Thinkphp框架进行开发&a…

linux进入telnet和推出telnet

安装telnet centos7 yum install -y telnet ubuntu apt install -y telnet 进入telnet telnet ip port 退出telnet 1. 按下下面的组合键 ctrl] 2. 输入下面命令推出 quit

Go 语言中 sync 包的近距离观察

让我们来看看负责提供同步原语的 Go 包&#xff1a;sync。 sync.Mutex sync.Mutex 可能是 sync 包中被广泛使用的原语。它允许对共享资源进行互斥操作&#xff08;即不允许同时访问&#xff09;&#xff1a; mutex : &sync.Mutex{}mutex.Lock() // Update shared variab…