[软件工程] 实现

2023-11-17

实现

实现

通常把编码和测试统称为实现。
  程序的质量主要取决于软件设计的质量,但是,所选用的程序设计语言的特点及编码风格也将对程序的可靠性、可读性、可测试性和可维护性产生深远的影响。
  测试的目的就是在软件投入生产性运行之前,尽可能多地发现软件中的错误。目前软件测试仍然是保证软件质量的关键步骤,它是对软件规格说明、设计和编码的最后复审。

7.1 编码

7.1.1 选择程序设计语言

程序设计语言的特点会影响人的思维和解题方式,会影响人和计算机通信的方式和质量,也会影响其他人阅读和理解程序的难易程度。
  编码之前的选择一种适当的程序设计语言是一项重要工作。
  高级语言明显优于汇编语言,在需要效率的某些场合,需要汇编语言,或者大型系统中执行时间非常关键的(或直接依赖于硬件的)一小部分代码需要用汇编语言书写之外,其他程序应该一律用高级语言书写。
  有理想的模块化机制,以及可读性好的控制结构和数据结构;为了便于调试和提高软件可靠性,语言特点应该使编译程序能够尽可能多地发现程序中的错误;为了降低软件开发和维护的成本,选用的高级语言应该有良好的独立编译机制。
  选择语言的主要实现标准:
    (1) 系统用户的要求。如果所开发的系统由用户负责维护,用户通常要求用他们熟悉的语言书写程序。
    (2) 可以使用的编译程序。运行目标系统的环境中可以提供的编译程序往往限制了可以选用的语言的范围。
    (3) 可以得到的软件工具。如果某种语言有支持程序开发的软件工具可以利用,则目标系统的实现和验证都变得比较容易。
    (4) 工程规模。如果工程规模很庞大,现有的语言又不完全适用,那么设计并实现一种供这个工程项目专用的程序设计语言,可能是一个正确的选择。
    (5) 程序员的知识。虽然对于有经验的程序员来说,学习一种新语言并不困难,但是要完全掌握一种新语言却需要实践。如果和其他标准不矛盾,那么应该选择一种已经为程序员所熟悉的语言。
    (6) 软件可移植性要求。如果目标系统将在几台不同的计算机上运行,或者预期的使用寿命很长,那么选择一种标准化程度高、程序可移植性好的语言就是很重要的。
    (7) 软件的应用领域。所谓的通用程序设计语言实际上并不是对所有应用领域都同样适用。因此,选择语言时应该充分考虑目标系统的应用范围。

7.1.2 编码风格

源程序代码的逻辑简明清晰、易读易懂应该遵循下述规则:

1.程序内部的文档

包括恰当的标识符、适当的注解和程序的视觉组织等等。
  选取含义鲜明的名字,使它能正确地提示程序对象所代表的实体,这对于帮助阅读者理解程序是很重要的。如果使用缩写,那么缩写规则应该一致,并且应该给每个名字加注解。
  注解非常有助于对程序的理解。
  每个模块开始处有序言性的注解:简要描述模块的功能、主要算法、接口特点、重要数据以及开发简史;
  程序中间与一段程序代码有关的注解:主要解释包含这段代码的必要性。
  不能滥用注释,应利用注解提供一些额外的信息。注解的内容一定要正确。
  程序清单的布局对于程序的可读性也有很大影响,应该利用适当的阶梯形式使程序的层次结构清晰明显。

2.数据说明

数据说明的次序应该标准化。有次序就容易查阅,因此能够加速测试、调试和维护的过程。
  当多个变量名在一个语句中说明时,应该按字母顺序排列这些变量。
  如果设计时使用了一个复杂的数据结构,则应该用注解说明用程序设计语言实现这个数据结构的方法和特点。

3. 语句构造

构造语句时应该遵循的原则是,每个语句都应该简单而直接,不能为了提高效率而使程序变得过分复杂。下述规则有助于使语句简单明了:

  • 不要为了节省空间而把多个语句写在同一行; - 尽量避免复杂的条件测试;
  • 尽量减少对“非”条件的测试;
  • 避免大量使用循环嵌套和条件嵌套;
  • 利用括号使逻辑表达式或算术表达式的运算次序清晰直观。

4. 输入输出

在设计和编写程序时应该考虑下述有关输入输出风格的规则:

  • 对所有输入数据都进行检验;
  • 检查输入项重要组合的合法性;
  • 保持输入格式简单;
  • 使用数据结束标记,不要要求用户指定数据的数目;
  • 明确提示交互式输入的请求,详细说明可用的选择或边界数值;
  • 当程序设计语言对格式有严格要求时,应保持输入格式一致;
  • 设计良好的输出报表;
  • 给所有输出数据加标志。

5. 效率

效率主要指处理机时间和存储器容量两个方面。
应该清晰3条概念:

  • 首先,效率是性能要求,因此应该在需求分析阶段确定效率方面的要求。软件应该像对它要求的那样有效,而不应该如同人类可能做到的那样有效(需求分析相关);
  • 其次,效率是靠好设计来提高的(设计相关);
  • 第三,程序的效率和程序的简单程度是一致的,不要牺牲程序的清晰性和可读性来不必要地提高效率(效率不是第一位的)。

下面从三个方面进一步讨论效率问题。

  • (1)程序运行时间
  • (2)存储器效率
  • (3) 输入输出的效率

7.2 软件测试基础

7.2.1 软件测试的目标

关于测试的一些规则:

  • (1) 测试是为了发现程序中的错误而执行程序的过程;
  • (2) 好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;
  • (3) 成功的测试是发现了至今为止尚未发现的错误的测试。

由于测试的目标是暴露程序中的错误,从心理学角度看,由程序的编写者自己进行测试是不恰当的。因此,在综合测试阶段通常由其他人员组成测试小组来完成测试工作。

7.2.2 软件测试准则

为了能设计出有效的测试方案,主要的测试准则:

(1)所有测试都应该能追溯到用户需求。

正如上一小节讲过的,软件测试的目标是发现错误。从用户的角度看,最严重的错误是导致程序不能满足用户需求的那些错误。

(2)应该远在测试开始之前就制定出测试计划。

完成需求模型可着手制定测试计划,在建立了设计模型之后就可以立即开始设计详细的测试方案。

(3)Pareto原理

测试发现的错误中的80%很可能是由程序中20%的模块造成的。当然,问题是怎样找出这些可疑的模块并彻底地测试它们。

(4)应该从“小规模”“大规模”测试

首先重点测试单个程序模块,然后把测试重点转向在集成的模块簇中寻找错误,最后在整个系统中寻找错误。

(5)穷举测试是不可能的

所谓穷举测试就是把程序所有可能的执行路径都检查一遍的测试。此路不通!
  因此,测试只能证明程序中有错误,不能证明程序中没有错误。但是,精心地设计测试方案,有可能充分覆盖程序逻辑并使程序达到所要求的可靠性。

(6)为了达到最佳的测试效果,应该由独立的第三方从事测试工作。

7.2.3 测试方法

测试有两种方法,即黑盒测试和白盒测试:
  如果已经知道了产品应该具有的功能,可以通过测试来检验是否每个功能都能正常使用——黑盒测试
  如果知道产品的内部工作过程,可以通过测试来检验产品内部动作是否按照规格说明书的规定正常进行——白盒测试

  • 黑盒测试法把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程。黑盒测试又称为功能测试。
  • 白盒测试法与黑盒测试法相反,它的前提是可以把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法。这种方法按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否都能按预定要求正确工作。白盒测试又称为结构测试。

7.2.4 测试步骤

根据第4条测试准则,应该从“小规模”“大规模”测试,测试过程也必须分步骤进行。大型软件系统通常的测试过程基本上由下述几个步骤组成:

模块测试

模块测试的目的是保证每个模块作为一个单元能正确运行,所以模块测试通常又称为单元测试。
在这个测试步骤中所发现的往往是编码和详细设计的错误。

子系统测试

将若干经单元测试的模块放在一起形成一个子系统,进行的测试称为子系统测试。这个步骤着重测试模块的接口。

系统测试

将经过测试的子系统装配成一个完整的系统来的测试。
  在这个过程中不仅应该发现设计和编码的错误,还应该验证系统确实能提供需求说明书中指定的功能,而且系统的动态特性也符合预定要求。在这个测试步骤中发现的往往是软件设计中的错误,也可能发现需求说明中的错误。
  不论是子系统测试还是系统测试,都兼有检测和组装两重含义,通常称为集成测试。

验收测试

  • 验收测试内容与系统测试基本类似,但是它是在用户积极参与下进行的,而且可能主要使用实际数据(系统将来要处理的信息)进行测试。
  • 验收测试的目的是验证系统确实能够满足用户的需要,在这个测试步骤中发现的往往是系统需求说明书中的错误。验收测试也称为确认测试。

平行运行

平行运行就是同时运行新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。这样做的具体目的有如下几点:
 (1)可以在准生产环境中运行新系统而又不冒风险;
 (2)用户能有一段熟悉新系统的时间;
 (3)以验证用户指南和使用手册之类的文档;
 (4)能够以准生产模式对新系统进行全负荷测试,可以用测试结果验证性能指标。

7.2.5 测试阶段的信息流

如图所示描绘了测试阶段的信息流,输入信息有两类:

  • (1)软件配置,包括需求说明书、设计说明书和源程序清单等;
  • (2)测试配置,包括测试计划和测试方案(测试用例、预定要检验的功能以及预期的正确输出);

比较测试的实际结果和预期结果,若两者不一致则很可能是程序中有错误。
设法确定错误的准确位置并且改正它,这就是调试的任务。与测试不同,通常由程序的编写者负责调试。
如果出现要求修改设计的严重错误,软件的质量和可靠性是值得怀疑的,应该进一步仔细测试;

同上述相反,功能完成得很正常,遇到的错误也很容易改正,则仍然应该考虑两种可能:

  • (1) 软件的可靠性是可以接受的;
  • (2) 所进行的测试尚不足以发现严重的错误。

这些错误最终将被用户发现,而且需要在维护阶段改正它们(但是改正同一个错误需要付出的代价比在开发阶段高出许多倍)。

7.3 单元测试

单元测试:测试模块。
  单元测试和编码属于软件过程的同一个阶段。
  在编写出源程序代码并通过了编译程序的语法检查之后,就可以用详细设计作指南,对重要的执行通路进行测试,以便发现模块内部的错误。
  可用人工测试和计算机测试两种测试方法,完成单元测试工作。
  单元测试主要使用白盒测试技术,而且对多个模块的测试可以并行地进行。

7.3.1 测试重点

单元测试着重从5个方面对模块进行测试:

1. 模块接口

首先应该对通过模块接口的数据流进行测试,主要检查下述几个方面:
  参数的数目、次序、属性或单位系统与变元是否一致;
  是否修改了只作输入用的变元;
  全局变量的定义和用法在各个模块中是否一致。

2. 局部数据结构

对于模块来说,局部数据结构是常见的错误来源。应该仔细设计测试方案,以便发现局部数据说明、初始化、默认值等方面的错误。

3. 重要的执行通路

由于通常不可能进行穷尽测试,因此,在单元测试期间选择最有代表性、最可能发现错误的执行通路进行测试就是十分关键的。
应该设计测试方案用来发现由于错误的计算、不正确的比较或不适当的控制流而造成的错误。

4. 出错处理通路

好的设计适当的处理错误的通路。
  应该认真测试这种通路。当评价出错处理通路时,应该着重测试下述一些可能发生的错误:
    (1) 对错误的描述是难以理解的;
    (2) 记下的错误与实际遇到的错误不同;
    (3) 在对错误进行处理之前,错误条件已经引起系统干预;
    (4) 对错误的处理不正确;
    (5) 描述错误的信息不足以帮助确定造成错误的位置。

5. 边界条件

边界测试是单元测试中最后的也可能是最重要的任务。
使用刚好小于、刚好等于和刚好大于最大值或最小值的数据结构、控制量和数据值的测试方案,非常可能发现软件中的错误。

7.3.2 代码审查

代码审查即人工测试源程序,由审查小组正式进行,它是一种非常有效的程序验证技术,对于典型的程序来说,可以查出30%~70%的逻辑设计错误和编码错误。审查小组最好由下述4人组成:
    (1) 组长,应该是一个很有能力的程序员,而且没有直接参与这项工程;
    (2) 程序的设计者;
    (3) 程序的编写者;
    (4) 程序的测试者。
  审查之前,小组成员应该先研究设计说明书,力求理解这个设计。
  一般先由设计者扼要地介绍他的设计,再由程序的编写者解释他是怎样用程序代码实现这个设计的,小组其他成员仔细倾听并力图发现其中的错误。
  另外一项工作,是对照程序设计常见错误清单,分析审查这个程序。当发现错误时由组长记录下来,审查会继续进行(审查小组的任务是发现错误而不是改正错误)。

7.3.3 计算机测试

单元测试必须为每个单元测试开发驱动软件和(或)存根软件。
  通常驱动程序也就是一个“主程序”,它接收测试数据,把这些数据传送给被测试的模块,并且印出有关的结果。
  存根程序代替被测试的模块所调用的模块。因此存根程序也可以称为“虚拟子程序”。它使用被它代替的模块的接口,可能做最少量的数据操作,印出对入口的检验或操作结果,并且把控制归还给调用它的模块。

7.4 集成测试

集成测试是测试和组装软件的系统化技术,比如子系统测试,主要目标是发现与接口有关的问题。

由模块组装成程序时有两种方法:
非渐增式测试方法:
一种方法是先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序,这种方法;
渐增式测试方法:
是把下一个要测试的模块同已经测试好的那些模块结合起来进行测试,测试完以后再把下一个应该测试的模块结合进来测试。

这两种方法哪种更好一些呢?下面对比它们的主要优缺点:

  • 非渐增式测试一下子把所有模块放在一起,极端困难,难于定位,难于改正。
  • 渐增式测试比较容易定位和改正错误;对接口可以进行更彻底的测试;可以使用系统化的测试方法。

因此,目前在进行集成测试时普遍采用渐增式测试方法。
  当使用渐增方式把模块结合到程序中去时,有自顶向下和自底向上两种集成策略。

7.4.1 自顶向下集成

自顶向下集成方法,从主控制模块开始,沿着程序的控制层次向下移动,逐渐把各个模块结合起来。
  用深度优先的策略,或者使用宽度优先的策略。
  深度优先,先组装在软件结构的一条主控制通路上的所有模块,选择主控制通路有一定的随意性。宽度优先,把处于同一个控制层次上的所有模块组装起来。

模块结合进软件结构具体过程有4个步骤:
    1、对主控制模块进行测试,测试时用存根程序代替所有直接附属于主控制模块的模块;
    2、根据选定的结合策略(深度优先或宽度优先),每次用一个实际模块代换一个存根程序(新结合进来的模块往往又需要新的存根程序);
    3、在结合进一个模块的同时进行测试;
    4、为了保证加入模块没有引进新的错误,可能需要进行回归测试(全部或部分重复做过的测试)。
从第二步开始不断地重复进行上述过程,直到构造起完整的软件结构为止。

7.4.2 自底向上集成

自底向上测试从“原子”模块(即在软件结构最低层的模块)开始组装和测试,具体步骤:
  第一步,把低层模块组合成实现某个特定的软件子功能的族;
  第二步,写一个驱动程序(用于测试的控制程序),协调测试数据的输入和输出;
  第三步,对由模块组成的子功能族进行测试;
  第四步,去掉驱动程序,沿软件结构自下向上移动,把子功能族组合起来形成更大的子功能族。
   重复上述第二步到第四步。

7.5 确认测试

确认测试也称为验收测试,它的目标是验证软件的有效性。
  那么,什么样的软件才是有效的呢?软件有效性的一个简单定义是: 如果软件的功能和性能如同用户所合理期待的那样,软件就是有效的。
  需求分析阶段产生的软件需求规格说明书,准确地描述了用户对软件的合理期望,因此是软件有效性的标准,也是进行确认测试的基础。
  确认测试必须有用户积极参与,或者以用户为主进行。

7.5.1 确认测试的范围

确认测试通常使用黑盒测试法。
  应该仔细设计测试计划和测试过程,保证软件能满足所有功能要求,能达到每个性能要求,文档资料是准确而完整的,此外,还应该保证软件能满足如安全性、可移植性、兼容性和可维护性等的要求。

7.5.2 软件配置复查

确认测试的一个重要内容是复查软件配置。
  复查的目的是保证软件配置的所有成分都齐全,质量符合要求,文档与程序完全一致,具有完成软件维护所必须的细节,而且已经编好目录。

7.5.3 Alpha和Beta测试

Alpha测试由用户在开发者的场所进行,并且在开发者对用户的“指导”下进行测试。开发者负责记录发现的错误和使用中遇到的问题。
  总之,Alpha测试是在受控的环境中进行的。
  Beta测试由软件的最终用户们在一个或多个客户场所进行,开发者通常不在Beta测试的现场。
  用户记录在Beta测试过程中遇到的问题,并且定期把这些问题报告给开发者。
  接收到在Beta测试期间报告的问题之后,开发者对软件产品进行必要的修改,并准备向全体客户发布最终的软件产品。

7.6 软件测试方法

软件测试方法分为两类:静态分析、动态测试。

7.6.1、静态分析方法

指以人工的、非形式化的方法对程序进行分析和测试。
  桌前检查(Desk Checking):由程序员检查自己的程序,对源代码进行分析、检验。
  代码会审(Code Reading Review):由程序员和测试员组成评审小组,按照“常见的错误清单”,进行会议讨论检查。
  步行检查(Walkthroughs):与代码会审类似,也要进行代码评审,但评审过程主要采取人工执行程序的方式,故也称为“走查”。

7.6.2 动态测试方法(1)

通过选择适当的测试用例,执行程序。
  常用的方法:

1、白盒法

分析程序的内部逻辑结构,注意选择适当的覆盖标准,设计测试用例,对主要路径进行尽可能多的测试。

2、黑盒法

不考虑程序的内部结构与特性,只根据程序功能或程序的外部特性设计测试用例。

7.6.2 动态测试方法(2)

1. 等价分类法

基本思想:根据程序的I/O特性,将程序的定义域划分为有限个等价区段 —“等价类”,从等价类中选择出的用例,具有“代表性”。
等价类分为:
  有效等价类 — 对于程序的规格说明,是合理的、有意义的输入数据构成的集合。
  无效等价类 —对于程序的规格说明,是不合理的、没有意义的输入数据构成的集合。

2. 边值分析法

基本思想: 选择等价类的边缘值作为测试用例,让每个等价类的边界都得到测试,选择测试用例既考虑输入亦考虑输出。

分析步骤:
A 先划分等价类。
B 选择测试用例,测试等价类边界。
边界选择原则:
A 按照输入值范围的边界。
B 按照输入/输出值个数的边界。
C 输出值域的边界。
D 输入/输出有序集的边界。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[软件工程] 实现 的相关文章

  • SpringBoot支付宝接入实战

    文章目录 支付宝支付后端实战 基于SpringBoot 一 支付宝支付介绍及接入指引 1 支付宝开放能力介绍 1 能力地图 2 电脑网站支付产品 2 接入准备 1 开放平台帐号注册 2 常规接入流程 3 使用沙箱 二 项目的环境准备 1 框
  • js小案例

    一次性定时器 div class dn div
  • C++,命名空间

    命名空间定义 namespace 命名空间名 变量名 函数 结构体 枚举名 全局引入命名空间 using namespace 命名空间名 部分引入命名空间 using namespace 命名空间名 变量名 注意 表示域限定符 在哪个位置使
  • 【实战加详解】二进制部署k8s高可用集群教程系列二 - ssl 证书简介

    TIP 二进制部署 k8s ssl 证书 转载请注明出处 https janrs com 1 ssl 证书简介 NOTE 在这里只做应用的简介 原理不做介绍 自行谷歌查阅 涉及到安全的 也不整理文档了 自行研究 1 1 什么是 ssl 证书
  • Java实现:寻找水仙花数

    Java实现 寻找水仙花数 文章目录 Java实现 寻找水仙花数 1 问题 2 解决方案 3 实现代码 4 执行结果 5 解决方法说明 穷举法 1 问题 寻找水仙花数 如果一个3位数等于其各位数字的立方和 则称这个数为水仙花数 例如 407
  • 奇异值分解方法求解最小二乘问题的原理

    文章目录 一 奇异值分解 SVD 原理 1 1 回顾特征值和特征向量 1 2 SVD的定义 1 3 求出SVD分解后的U V矩阵 1 4 SVD计算举例 1 5 SVD的一些性质 二 线性最小二乘问题 2 1 最小二乘问题复习 2 2 奇异
  • 最小二乘法拟合圆(Python)

    上文已经对比了三种数据点拟合圆的方法 本文分享最小二乘法的拟合过程 旨在了解如何用Python编程拟合圆 usr bin env python coding utf 8 This program is debugged by Harden
  • Markdown插入视频、mp3音频和gif图的语法

    总所周知 鄙人有一个专栏叫做 差生文具多 里面记录了一些工具的使用方法 以及使用工具时会遇到的一些问题 于是乎 之前就有一个朋友在群里问道 markdown如何插入视频 当时的我不会弄 然后就出现了下面这一幕 明天就弄 开整 然而这篇博客是
  • ARM64_VS2017 动态库 静态库编译 主程序调用环境搭建

    ARM64 VS2017 动态库 静态库编译 主程序调用环境搭建 1 打开Visual Studio Installer安装linux开发环境 2 配置linux环境 工具 gt 选项 gt 跨平台 gt 连接管理器 gt 添加 远程lin
  • mkdir()和mkdirs()区别

    mkdir 和mkdirs 区别如下 mkdirs 可以建立多级文件夹 mkdir 只会建立一级的文件夹 如下 new File tmp one two three mkdirs 执行后 会建立tmp one two three四级目录 n
  • 算法:回文字符串

    要求 给定一个字符串数组 判断出所有的回文字符串 class Solution public List
  • 预备打工人之SystemC学习 (五) 事务级建模库

    预备打工人之SystemC学习 TLM2 0基本概念 松散定时建模 近似定时模型 近似定时建模和松散定时建模的使用 发起者 目标 套接字和桥 DMI和调试传送结构 合并接口和套接字 名字空间和头文件 通用净核类 定义 构造 赋值和析构函数
  • JS栈内存和堆内存详解

    JS变量都存放在内存中 而内存给变量开辟了两块区域 分别为栈区域和堆区域 栈像个容器 容量小速度快 堆像个房间 容量较大 一 基本数据类型和引用数据类型存储方式 js中的数据类型可以分为基本类型和引用类型 基本类型是存在栈内存中的 引用类型
  • 在网页的JS中注入Hook

    在网页的JS中注入Hook Chrome浏览器的overrides的使用 itcoder cn 1 以下为Edge 的示例 1 本地新建一个目录 2 用浏览器关联该目录 选择目录后 浏览器上方会弹出一个横条提示确认 点击允许后即可关联 3
  • Java实现MD5加密及解密的代码实例分享

    原文地址 http www jb51 net article 86027 htm 如果对安全性的需求不是太高 MD5仍是使用非常方便和普及的加密方式 比如Java中自带的MessageDigest类就提供了支持 这里就为大家带来Java实现
  • muduo net库学习笔记4——事件驱动循环EventLoop、runInLoop和queueInLoop及对应唤醒

    首先总体情况 每个muduo网络库有一个事件驱动循环线程池 EventLoopThreadPool 线程池用在事件驱动循环上层 也就是事件驱动循环是线程池中的一个线程 每个TcpServer对应一个事件驱动循环线程池 每个线程池中有多个事件
  • jupyter notebook新建python3空白_jupyter notebook 启动出现404 302,web空白页无反应

    原来装过官网的python2 7和3 6 在这基础上装了anaconda3 启动jupyter notebook时出现404和302 复制url到猎豹和IE浏览器都没有反应 token复制也不行 后来卸载了官网的python2 7和3 6也
  • 区块链基础:交易模型解读

    1 比特币系统UTXO解读 UTXO unspent transaction output 未花费的交易输出 这是比特币交易中核心概念 UTXO是比特币拥有者的公钥锁定的一个数字 实际是是拥有者的公钥加密的数字 只有拥有者的私钥才能解开 U
  • go语言常用标准库(Time)

    go语言常用标准库 Time 1 Time 时间和日期是我们编程中经常会用到的 本文主要介绍了Go语言内置的time包的基本用法 1 1 1 time包 time包提供了时间的显示和测量用的函数 日历的计算采用的是公历 1 1 2 时间类型

随机推荐

  • 线性代数的本质(十一)——复数矩阵

    文章目录 复数矩阵 附录 极大线性无关组 向量叉积 复数矩阵 矩阵 A A A 的元素 a i j
  • 斐波那契数列的递归与非递归

    斐波那契数列 F n 1 n 0 1时 F n F n 1 F n 2 n gt 1时 1 递归实现 int Fib int n if n 1 n 0 return 1 return Fib n 1 Fib n 2 时间复杂度 O 2 n
  • idea常用的快捷键和常用设置

    目录 1 常用idea快捷键 2 查找相关快捷键 3 常用项目快捷键 设置字体 字体文本设置 切换主题 字符编码设置 IDEA模板 idea 目录分层 1 常用idea快捷键 1 全选 CTRL A 最简单 几乎所有的编辑器都有此功能 2
  • UISearchBar 和 UISearchDisplayController的使用

    之前比較少用UISearchBar 和 UISearchDisplayController 最近閱讀了一些有關資料 簡單做個筆記 1 UISearchBar 和 UISearchDisplayController 在IB中是可以直接使用的
  • Xshell连接VMware CentOS7

    https blog csdn net weixin 43593086 article details 90247751
  • Android屏幕适配

    一 一些概念的理解 屏幕尺寸 屏幕的对角线 如一台小米电视49寸说的就是电视对角线长度是49寸 1英寸 2 54厘米 分辨率 1920 1080指纵向1920个像素点 横向1080个像素点 1280 720同理 屏幕像素密度 DPI
  • 跟我说回家,却还在外面鬼混,python程序员教你用微信给对方定位

    跟我说回家 却还在外面鬼混 其实很多情侣之间存在很多这样的信任问题 不相信他 去查岗 可能会恶化两人之间的关系 比如跟我说回家了 但是想知道他是否真的回家了 打电话 打视频查岗吗 今天教大家一个利用微信来给对方定位的黑科技 实现方法 其实实
  • python连接clickhouse,并实现对表内数据的增删改查

    基本信息 clickhouse 基本介绍可以参考 https clickhouse com docs zh python 连接 clickhouse 可以参考 https clickhouse com docs en integration
  • 网络 链路层

    数据链路层是计算机网络的底层 主要负责相邻设备之间的数据帧传输 链路层就是负责每一个相邻结点之间的数据传输 但是相邻设备之间也需要描述识别 主要是因为每一个设备都有可能有多个相邻的设备 这种识别在链路层中是通过MAC地址来实现的 MAC地址
  • C++ 类型转换

    文章目录 c语言中的类型转换 为什么C 需要四种类型转换 C 强制类型转换 static cast reinterpret cast const cast dynamic cast c语言中的类型转换 在C语言中 如果赋值运算符左右两侧类型
  • centos7 搭建深度学习环境

    本文引用转载自博客园 经实践可用 对原内容进行了删减调整 后续作者理解更深了 可能更新 一 安装NVIDA组件 1 安装CUDA CUDA又叫cuda toolkit 是NVIDA公司专门开发的一套接口 方便利用GPU做高速计算 主流的深度
  • 将hexo博客搭建在github上

    注册github账号并创建仓库 首先在github上注册账号 填写用户名 email 密码 会有验证通过邮箱发送给你 进行验证 选择仓库 创建一个和你用户名相同的仓库 如 你的 用户名 github io 必须以用户名开头 创建仓库 步骤
  • java8的函数式编程

    1 函数式接口 特定的一类接口 概念 接口里面有且只有一个抽象方法 对于接口里面的默认方法和静态方法不作限制 一般会有 FunctionalInterface修饰 可以没有 FunctionalInterface public interf
  • Redis如何实现布隆过滤器

    本文将介绍布隆过滤器的原理以及Redis如何实现布隆过滤器 应用场景 1 50亿个电话号码 现有10万个电话号码 如何判断这10万个是否已经存在在50亿个之中 可能方案 数据库 set hyperloglog 2 新闻客户端看新闻时 它会不
  • QObject::connect: Cannot queue arguments of type 'string'

    信号槽传递非Qt库类型参数时 出现QObject connect Cannot queue arguments of type string Make sure string is regi 例如以C 标准库中string做参数 则会出现
  • mockjs的基本使用和登录跳转到主页加折叠事件

    目录 1 mockjs 1 1 mockjs介绍 1 2 mockjs使用步骤 1 2 1 安装mockjs依赖 1 2 2 在项目中引入mockjs 1 2 3 创建目录和文件 1 2 4 为每个组件准备模拟数据 1 2 5 测试 1 2
  • 零基础如何学习Java?Java学习路线图

    课程表 笔记 包含知识点 Java 第一天 基础语法 人机交互 Java以及发展史 主要特性 JRE和JDK Java 第二天 Java基础 注释 字面量 变量 数据类型 标识符 键盘录入 Java 第三天 IDEA下载安装 IDEA下载安
  • MySql-MHA-Docker 集群部署搭建

    MySql MHA Docker集群部署搭建 本文概述 机器准备 前置条件 MySQL主从复制集群搭建 1 安装mysql 准备3台机器安装mysql 2 安装配置mysql master 3 安装配置 88 mysql slave 4 安
  • [665]微信之wechat-sender(基于wxpy库)

    注意 wechat sender基于wxpy wxpy基于itchat 目前腾讯以大批量关闭微信网页版接口 所以wechat sender当前已不能使用 以下仅做学习记录 wechat sender 是基于 wxpy 和 tornado 实
  • [软件工程] 实现

    实现 实现 7 1 编码 7 1 1 选择程序设计语言 7 1 2 编码风格 1 程序内部的文档 2 数据说明 3 语句构造 4 输入输出 5 效率 7 2 软件测试基础 7 2 1 软件测试的目标 7 2 2 软件测试准则 1 所有测试都