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

Golang清晰代码指南

在这里插入图片描述

发挥易读和易维护软件的好处 - 第一部分

嗨,开发者们,清晰的代码是指编写易于阅读、理解和维护的软件代码。它是遵循一组原则和实践,优先考虑清晰性、简单性和一致性的代码。清晰的代码旨在使代码库更易管理,减少引入错误的可能性,并提高开发者之间的合作。清晰的代码不仅仅是为了达到某种审美标准;它对开发者和整个软件开发流程都有实实在在的好处。

以下是清晰代码的一些关键方面以及它们的重要性:

  1. 可读性: 清晰的代码易于阅读和理解。这非常重要,因为开发者花费大量时间阅读和理解代码,以便修改或扩展它。难以阅读的代码可能导致误解、混淆和错误。
  2. 可维护性: 代码在其生命周期内需要不断维护。清晰的代码更容易维护,因为它结构化,使得在不无意中影响代码库的其他部分的情况下进行更改或添加新功能变得更简单。
  3. 减少错误: 清晰的代码往往有更少的错误,因为人们更容易推理和理解。这意味着在处理清晰代码时,开发者更不可能引入新错误,而且如果出现错误,也更容易定位和修复。
  4. 合作: 在协作开发环境中,多个开发者通常在同一个代码库上工作。清晰的代码通过使开发者更容易理解彼此的工作、提供反馈并有效地协作来改善合作。
  5. 可扩展性: 随着项目的增长,保持清晰的代码库变得更加重要。清晰的代码有助于防止技术债务的积累,技术债务指的是在短期内采取捷径或次优解决方案,导致长期维护挑战的情况。
  6. 重构: 重构涉及改善代码的内部结构,但不改变其外部行为,对于清晰的代码来说更容易且更安全。开发者可以自信地重构代码,因为他们知道这些变化不会引入意外的副作用。
  7. 文档: 清晰的代码往往在一定程度上是自描述的。有意义的变量名称、组织良好的函数和清晰的注释使得其他开发者(包括您未来的自己)更容易理解代码的目的和功能。
  8. 代码审查: 在代码审查过程中,清晰的代码更有可能通过审核。审阅者可以专注于高级设计和逻辑问题,而不是陷入费解的代码中。
  9. 时间效率: 编写清晰的代码可能在最初需要更多时间,但在调试、维护和理解方面节省的时间将远远弥补这一点。

总的来说,清晰的代码是对您的同行开发者和未来自己的一种尊重方式。它导致更高效、更愉快的软件开发,减少了挫折感,并有助于项目的整体成功。它不仅仅是编写可工作的代码;它是编写清晰、易于维护且随着时间推移易于使用的代码。

1. 使用描述性命名

在编码的世界中,精确性和清晰度至关重要,命名的选择可以显著影响代码库的质量和可维护性。描述性的命名不仅增强了您的代码的可读性,还传达了程序中各种元素的目的和功能。在本文中,我们将探讨为变量、函数和类型使用有意义名称的重要性,同时深入探讨了这种编码实践的强大之处,并提供了实际示例来突显这种做法的力量。

为变量、函数和类型选择有意义的名称

在命名方面,精确性至关重要。描述性的名称为关联元素的角色和行为提供了有价值的见解,使您和其他开发者更容易理解和使用代码。以下是一些需要考虑的最佳实践:

  1. 避免单个字母的名称: 单个字母的名称可能看起来简洁,但通常缺乏上下文,尤其是在您的代码库不断增长时可能会引起混淆。对于范围非常有限的变量,如循环计数器,可以例外。

    示例:不要使用 xi 作为循环计数器,选择 indexiteration

  2. 为变量和函数使用驼峰命名法: 驼峰命名法是许多编程语言中广泛接受的命名约定。它涉及将每个单词的首字母大写(除了第一个单词),而不使用空格。

    示例:不要使用 myvariable,使用 myVariable。不要使用 calculatetotal,使用 calculateTotal

  3. 优先选择清晰而不是巧妙的命名: 虽然巧妙的名称可能看起来很风趣,但它们可能会使您的代码的含义变得模糊。优先选择清晰度,并选择能够传达元素目的和功能的名称。

    示例:不要使用 magicNumber,使用 numberOfDaysInWeek

  4. 反映功能: 力求捕捉变量、函数或类型所代表的本质。名称应该传达元素的作用或其所持有的值。

    示例:不要使用 temp,使用 temperature。不要使用 calc,使用 calculate

有意义命名的实际示例

让我们探索一些实际示例,以说明如何通过有意义的命名来提高代码的可读性和理解度:

示例1:没有使用有意义命名:

const a = 5;
const b = 10;function f(x, y) {return x + y;
}const c = f(a, b);
console.log(c); // Output: 15

示例1:使用有意义的命名:

const num1 = 5;
const num2 = 10;function addNumbers(number1, number2) {return number1 + number2;
}const sum = addNumbers(num1, num2);
console.log(sum); // Output: 15

在第二个示例中,使用了描述性的变量和函数名称,立即清楚地表明了代码正在做什么。任何阅读代码的人都可以轻松理解这段代码是在进行两个数字的相加。

示例2:没有使用有意义的命名:

const d = new Set();
d.add("apple");
d.add("banana");
d.add("orange");console.log(d.has("banana")); // Output: true

示例2:使用有意义的命名:

const fruitSet = new Set();
fruitSet.add("apple");
fruitSet.add("banana");
fruitSet.add("orange");console.log(fruitSet.has("banana")); // Output: true

在第二个示例中,变量名fruitSet清晰地表明我们正在处理一组水果。这提高了可读性,并使代码更加自解释。

缩进和格式化

标题: Go中的代码缩进和格式化技巧:最佳实践与工具

在编程世界中,编写清晰、格式良好的代码和编写功能性代码一样重要。适当的缩进和格式化不仅增强了代码的可读性,还有助于项目整体的可维护性。在本文中,我们将深入探讨代码缩进和格式化的艺术,重点介绍在Go代码库中实现优雅和一致性的最佳实践和工具。

制表符用于缩进:增强可读性和一致性

打造良好结构化代码的第一步是采用一致的缩进风格。在Go编程世界中,制表符是无可争议的缩进冠军。使用制表符不仅符合Go的标准约定,还通过提供统一的视觉代码表示方式,简化了开发者之间的协作。

通过利用制表符,您可以在整个代码库中轻松地保持和谐、有序的外观。这个小细节极大地帮助区分了各种代码块和嵌套结构的级别,从而提高了代码理解度。

合理的行长度:取得平衡

虽然在Go中我们并不受到严格的行长度限制,但遵循合理的行长度极大地提高了代码的可读性。在简洁性和清晰性之间取得平衡,通常建议将行长控制在80到100个字符之间。

这种做法确保您的代码在各种屏幕和不同环境下仍然可以舒适地查看。较长的行经常导致水平滚动,这可能会打断阅读和理解代码的流程。通过保持代码在推荐范围内,您鼓励自己和其他开发者编写既简洁又连贯的代码。

拥抱自动化:gofmt和IDE功能

确保项目中一致的缩进和格式化,特别是在协作开发中,可能看起来是一项艰巨的任务。幸运的是,Go编程社区已经采用自动化来解决这个问题。

引入gofmt,格式统一的守护者。这个内置工具是执行Go格式规范的您的盟友。通过简单的命令,gofmt会自动重新格式化您的代码,以符合官方Go样式指南。它是在不需要手动干预的情况下保持代码优雅的强大助手。

对于那些更喜欢无缝体验的人,许多集成开发环境(IDE)提供了与gofmt标准对齐的本地功能或插件。这些工具在后台不知疲倦地工作,当您输入时将您的代码转变成精美格式化的杰作。

有效的包组织

高效的包组织是构建结构良好、易于维护的Go项目的基础。采用智能包管理实践具有提高代码可读性和协作性的能力,这是必不可少的。在本文中,我们将深入探讨包组织的核心原则,提供见解和示例,优化您的Go项目结构。

清晰分组:有效包组织的关键

想象一下,每个拼图块都代表您项目的一部分。挑战在于安排这些拼图块,使它们完美契合并呈现出一个连贯的图案。包就是您解决这个谜题的工具包。

包就像容器,将相关文件捆绑在一起,为您组织代码提供了系统化的方式。通过将共同工作的文件放在一个包下,您创造了一个逻辑结构,易于导航。当您需要找到特定功能时,您会发现它就在其指定的包中。

简单即高效:小写包名称

Go的优雅性也延伸到了包的命名。为了保持简单明了,请为您的包使用小写名称。例如,名为utils的包清晰地指示了其用途——存放实用函数或共享代码。

选择小写包名称作为开发者的即时线索。它让他们能够快速了解包的作用,而无需深入细节。这种简单性最小化了歧义,推动了您的开发工作流程。

避免过度复杂化:解决过度嵌套

包是您的盟友,但过度嵌套可能会让您走上一条复杂的道路。假设您正在构建一个Web应用程序。与其像web -> controllers -> admin -> user这样过度嵌套包,不如保持简洁。

通过避免深层嵌套,您可以保持一个清晰易懂的层次结构。每个嵌套层次都应该增加价值,而不是复杂性。目标是建立一个逻辑清晰而不会令人不知所措的结构。

文件结构

创建一个结构良好的Go项目就像建造一个坚固的建筑一样——能够经受住复杂性,促进无缝的开发。在本文中,我们将指导您如何为Go项目打造一个高效的文件结构,并提供实际示例。

一个包一个目录:文件结构的基础

将包视为整齐排列的抽屉,每个抽屉都包含具有共同主题的物品。同样地,使用每个目录一个包的方式来构建项目提供了清晰和简洁。这种方法可以防止混乱,简化了访问相关代码的过程。

例如,如果您正在开发一个消息应用程序,可能会有一个messages包。所有与消息相关的文件都将驻留在这个包目录中,使得查找和使用与消息相关的组件变得轻松自如。

命令掌舵:cmd目录

想象一个重要决策都在的指挥中心。cmd目录就是您项目的指挥中心。这是您放置主要程序或启动各种功能的入口点的地方。将这些主要程序放在专用目录中可以增强组织性并确保轻松访问。

假设您正在开发一个电子商务应用程序。在cmd目录中,您可能有一个checkout目录,其中包含负责结账流程的主程序。这种分离关注点的方法确保您的代码库保持结构化和连贯。

工具函数找到自己的位置:组织实用函数

实用函数就像可以简化您工作的可靠工具。为了方便使用,最好将实用函数放在它们所属包的目录中。这样可以确保相关的实用函数可以轻松地被需要它们的组件所调用。

想象一下您正在编写一个天气应用程序。在weather包内,您可以为处理数据解析或单位转换的实用函数创建一个单独的文件。这种集中的安排简化了维护工作,并避免了寻找必要函数的麻烦。

总的来说,在Go项目中打造一个连贯的文件结构是一个策略性的举措。采用一个目录一个包的原则来保持清晰,使用cmd目录作为指挥中心,并将实用函数嵌套在各自的包内。遵循这些原则,您就在通向一个结构良好、高效的Go项目之路上了。

注释的力量

在代码库中导航就像探索一个新城市一样——您需要适当的标志和解释来使旅程顺利进行。在本文中,我们将深入探讨注释的世界,以及它们如何在您的代码中作为指路明灯。

揭开注释的面纱:通往清晰的路标

注释是您可靠的向导,为您的代码提供背景和洞见。当您遇到复杂或非常规的解决方案时,它们尤其有用。通过有策略地放置注释,您使您的代码库更易接近和理解。

想象一下,您正在设计一个优化搜索结果的算法。复杂的算法可能让其他开发人员摸不着头脑。这就是注释发挥作用的时候。通过阐明您选择背后的原因,您为协作和共同理解铺平了道路。

完整句子传递清晰的沟通

正如一句构思良好的句子传达意义,注释中的完整句子传达了代码目的的本质。使用注释讲述代码背后的故事,提高其可读性。

比如说,您正在构建一个数据可视化模块。在您的代码中,一行代码可能提取了关键数据。通过添加注释,比如 // 提取数据用于绘图,您为其他开发人员即时展示了这行代码的目的。

// 单行或 /* 多行 */:编写注释

在注释领域,表达方式有灵活性。对于简明扼要的注解,选择 // 创建单行注释。这些非常适合简短的解释,不会打断代码的流程。

另一方面,多行注释 /* */ 提供更详细解释的空间。适度使用它们来深入探讨特定部分或函数的复杂性。

举个例子,想象您正在处理一个机器学习模型。一行单行注释可能解释了一个超参数的重要性,而多行注释可以逐步详细说明算法的逻辑。

注释是您代码的讲故事者。它们阐明了复杂性,阐明了设计选择,并促进了协作。通过使用完整的句子和选择合适的注释样式来发挥它们的力量。就像一张被良好注释的地图使探索变得愉快一样,良好注释的代码使开发变得轻松自如。

文档

在编码领域,文档是将清晰呈现复杂性的线索。在本文中,我们将踏上文档的世界之旅,探索它是如何将代码转化为可理解的杰作的。

文档:您代码的指引之光

把文档看作是一张指引同行者穿越陌生地形的地图。它为您的代码组件的目的、用法和行为提供了阐明,使协作更加顺畅,故障排除更有效。

当您为公共函数和类型编写文档时,实际上是在您的意图和他人理解之间架起了一座桥梁。公共函数就像地标一样,文档化它们确保其他人可以轻松穿越您的代码库。

Godoc格式:打造文档的魔力

进入Godoc格式,这是一个将您的注释转换为结构化文档的工具。就像一位艺术家需要正确的画笔来创作杰作一样,一个开发者需要Godoc格式来打造完美的文档。

当您撰写注释时,请采用Godoc风格。从概括函数目的的句子开始,然后是更详细的解释。将这些注释视作引导开发人员深入理解您代码的面包屑。

代码示例:释放文档的力量

让我们通过一个简单的例子来说明这一点。想象一下,您正在构建一个计算各种几何形状面积的库。其中一个公共函数计算圆的面积。下面是您可能使用Godoc格式记录它的方式:

// CircleArea calculates the area of a circle given its radius.
// It returns the calculated area as a float64.
func CircleArea(radius float64) float64 {return math.Pi * radius * radius
}

对于这个例子,函数CircleArea上方的注释概括了其目的和预期行为。通过遵循Godoc格式,您为他人提供了一个清晰的路线图,以理解和利用您的代码。

有效的错误处理

在不断发展的软件开发领域,错误就像不可避免的风暴,可能会打乱即使是最流畅的代码。在本文中,我们将探索错误处理的艺术,揭示驯服错误和故障的技巧。

错误处理:为稳定性规划航线

将错误处理视为锚,防止您的船漂向险恶的水域。它是确保您的软件对意外故障做出优雅响应,保持稳定性和用户满意度的机制。

在这场航海旅程中的一个基本规则是从函数中作为最终值返回错误。遵循这一原则,您为识别和解决问题提供了清晰的路径,无论它们是由于无效输入、意外行为还是外部因素引起的。

预防的力量:返回错误,而不是恐慌

当面对汹涌的水域时,本能可能会是拉响恐慌警报。然而,在软件领域,恐慌应该保留给真正灾难性的情况。对于可以预见并解决的错误,返回值是您的盟友。

返回错误而不是诉诸恐慌可以实现优雅的恢复。它将潜在的灾难转化为改进的机会。作为您代码的船长,您有责任朝着韧性前进。

代码示例:航行错误处理的水域

考虑这样一个场景,您正在构建一个用于两个数字相除的函数。以下是您可能在此情境下处理错误的方式:

func Divide(a, b float64) (float64, error) {if b == 0 {return 0, fmt.Errorf("division by zero")}return a / b, nil
}

在这个例子中,Divide 函数返回除法的结果以及一个错误。如果分母为零,就会返回一个错误,表明可以优雅地处理的问题,而无需触发恐慌。

条件语句:错误处理中的救星

将“if语句”视为您在错误的汹涌海洋中的救星。使用if语句明确处理错误允许您掌控局势,实施备用策略、通知用户或记录诊断信息。

通过避免陷入恐慌的诱惑,拥抱if语句的清晰性,您将把错误从令人畏惧的敌人转变为软件开发旅程中宝贵的伴侣。

高效的导入

在编码领域,导入语句是引导您的代码库走向清晰和高效的指南针。在本文中,我们将启航,探索导入包的艺术,并揭示创建组织化和简洁的导入语句的策略。

导入语句:为清晰代码设定航线

将导入语句视为您邀请登上代码船的船员。它们携带着完成软件任务所需的工具和资源。为了确保您的代码保持整洁和高效,认真管理您的导入至关重要。

在这次航行中的一个基本规则是仅导入您所需的包。就像过度打包会使航行混乱一样,导入不必要的包会使您的代码库臃肿,并且难以维护。

清晰性的力量:使用包别名

想象一下在没有清晰标志的情况下导航。同样地,导入包时若缺乏清晰性会导致混乱。通过使用包别名,您有效地在代码中设置导航信标,确保每个包的目的一目了然。

以下是包别名如何提供清晰度的示例:

import ("fmt""net/http"myfmt "myapp/fmt"
)

在这个例子中,别名 myfmt 将您的本地 fmt 包与标准库的 fmt 包区分开来。

代码示例:分组导入,畅行无阻

整理您的导入就像整理船舱的货物一样。将导入分为标准库、第三方和本地包,可以创建一个组织有序且易于导航的代码库。

import ("fmt""net/http""github.com/thirdparty/pkg""github.com/thirdparty/anotherpkg""myapp/internal/utils""myapp/internal/models"
)

这种结构化的方法确保您的导入被整齐地划分,促进了秩序和可预测性的感觉。

迈向清晰的过渡:导入摘要

在这次导入包的航程中,清晰度是您的北极星。通过仅导入所需内容、使用包别名进行区分,并对导入进行分组,您正在打造一个既高效又易于理解的代码库。

请记住,就像一艘组织有序的船舶航行顺利一样,一个结构良好的代码库为创新、合作以及成功实现软件目标铺平了道路。所以,请自信地启航,让您的导入语句引领您的代码走向更光明的未来。

相关文章:

Golang清晰代码指南

发挥易读和易维护软件的好处 - 第一部分 嗨,开发者们,清晰的代码是指编写易于阅读、理解和维护的软件代码。它是遵循一组原则和实践,优先考虑清晰性、简单性和一致性的代码。清晰的代码旨在使代码库更易管理,减少引入错误的可能性…...

C语言 文件I/O(备查)

所有案列 跳转到其他。 文件打开 FILE* fopen(const char *filename, const char *mode); 参数:filename:指定要打开的文件名,需要加上路径(相对、绝对路径)mode:指定文件的打开模式 返回值:成…...

web(HTML之表单练习)

使用HTML实现该界面: 要求如下: 用户名为文本框,名称为 UserName,长度为 15,最大字符数为 20。 密码为密码框,名称为 UserPass,长度为 15,最大字符数为 20。 性别为两个单选按钮&a…...

通过对象轮换实现 LRU 缓存结构

文章目录 通过两个对象轮换,按照是否访问实现内容长久保存rollup 的缓存实现 export default function (max) { //max 缓存容量var num, curr, prev;var limit max || 1;function keep(key, value) {if (num > limit) {prev curr; // 超过容量时当前对象变成缓…...

【Unity动画】综合案例完结-控制角色动作播放+声音配套

这个案例实现的动作并不复杂,主要包含一个 跳跃动作、攻击动作、还有一个包含三个动画状态的动画混合树。然后设置三个参数来控制切换。 状态机结构如下: 完整代码 using System.Collections; using System.Collections.Generic; using UnityEngine;pu…...

【工作流Activiti】任务组

1、Candidate-users候选人 1.1、需求 在流程定义中在任务结点的assignee固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn文件中,如果要临时变更任务负责人则需要修改流程定义,系统扩展性很差,针对这种情况,我…...

桌面概率长按键盘无法连续输入问题

问题描述:概率性长按键盘无法连续输入文本 问题定位: 系统按键流程分析 图一 系统按键流程 按键是由X Server接收的,这一点只要明白了X Window的工作机制就不难理解了。X Server在接收到按键后,会转发到相应程序的窗口中。在窗…...

用23种设计模式打造一个cocos creator的游戏框架----(十九)备忘录模式

1、模式标准 模式名称:备忘录模式 模式分类:行为型 模式意图:在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态 结构图: 适用于: …...

动手学深度学习-自然语言处理-预训练

词嵌入模型 将单词映射到实向量的技术称为词嵌入。 为什么独热向量不能表达词之间的相似性? 自监督的word2vec。 word2vec将每个词映射到一个固定长度的向量,这些向量能更好的表达不同词之间的相似性和类比关系。 word2vec分为两类,两类…...

力扣200. 岛屿数量(java DFS解法)

Problem: 200. 岛屿数量 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 该问题可以归纳为一类遍历二维矩阵的题目,此类中的一部分题目可以利用DFS来解决,具体到本题目: 1.我们首先要针对于二维数组上的每一个点,尝试展…...

解决el-table组件中,分页后数据的勾选、回显问题?

问题描述: 1、记录一个弹窗点击确定按钮后,table列表所有勾选的数据信息2、再次打开弹窗,回显勾选所有保存的数据信息3、遇到的bug:切换分页,其他页面勾选的数据丢失;点击确认只保存当前页的数据&#xff1…...

web网络安全

web安全 一,xss 跨站脚本攻击(全称Cross Site Scripting,为和CSS(层叠样式表)区分,简称为XSS)是指恶意攻击者在Web页面中插入恶意javascript代码(也可能包含html代码),当用户浏览网页之时&…...

若依 ruoyi-vue3 集成aj-captcha实现滑块、文字点选验证码

目录 0. 前言0.1 说明 1. 后端部分1.1 添加依赖1.2. 修改 application.yml1.3. 新增 CaptchaRedisService 类1.4. 添加必须文件1.5. 移除不需要的类1.6. 修改登录方法1.7. 新增验证码开关获取接口1.8. 允许匿名访问 2. 前端部分(Vue3)2.1. 新增依赖 cryp…...

安卓10 flutter webview 回退会闪退

现象 在安卓10设备上,访问了webview页面后,回退到其他页面后,大概率会闪退,请查看issuses https://github.com/flutter/flutter/issues/78405 解决思路:在回退前,先把webview销毁掉,重新生成一个…...

【Unity入门】物体5种移动方法

目录 一、通过修改位置来实现移动二、通过物理系统实现位移三、通过CharacterController组件四、通过输入控制物体移动 一、通过修改位置来实现移动 利用修改Transform组件的position的两种常用方法。 使用Translate()函数 /*物体将向x方向移动1.5单位…...

Elasticsearch的 8.x常用api汇总

ES的查询语法比较复杂,对于初学者需要在不断练习中才会逐渐掌握,本文汇总了ES各种查询语法以及常用api,可以作为新手的实用笔记 首先,安装 Kibana! 下载Elasticsearch,官方下载页面;Elasticsearch 参考,官方文档;<...

k8syaml提供的几个有意思的功能,Kubernetes在线工具网站

k8syaml.cn 提供的几个有意思的功能。 一、yaml资源快速生成 之前编写operator的helm的时候就需要自己写deployment、service、configmap这些资源&#xff0c;那么多字段也记不清&#xff0c;都是先找个模版&#xff0c;然后copy改改&#xff0c;再看官方文档&#xff0c;添加…...

【图像分类】【深度学习】【Pytorch版本】 ResNeXt模型算法详解

【图像分类】【深度学习】【Pytorch版本】 ResNeXt模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】 ResNeXt模型算法详解前言ResNeXt讲解分组卷积(Group Converlution)分割-变换-合并策略(split-transform-merge)ResNeXt模型结构 ResNeXt Pytorch代码完整代码总…...

Android 14 应用适配指南

Android 14 应用适配指南&#xff1a;https://dev.mi.com/distribute/doc/details?pId1718 Android 14 功能和变更列表 | Android 开发者 | Android Developers 1.获取Android 14 1.1 谷歌发布时间表 https://developer.android.com/about/versions/14/overview#timeli…...

【AI美图提示词】第07期效果图,AI人工智能自动绘画,精选绝美版美图欣赏

AI诗配画 山水画中景如画&#xff0c;云雾缭绕峰峦间。桥畔流水潺潺响&#xff0c;诗意盎然山水间。上面的诗句和图片全部来自AI自动化完成&#xff0c;这就是技术的力量&#xff0c;接下来我们进行模型生成学习&#xff1a; 先上原始底图&#xff1a; 下面是模型生成效果图&a…...

前端知识(十三)——JavaScript监听按键,禁止F12,禁止右键,禁止保存网页【Ctrl+s】等操作

禁止右键 document.oncontextmenu new Function("event.returnValuefalse;") //禁用右键禁止按键 // 监听按键 document.onkeydown function () {// f12if (window.event && window.event.keyCode 123) {alert("F12被禁用");event.keyCode 0…...

面向对象设计与分析(28)单例模式的奇异递归模板CRTP实现

前面我们介绍了单例模式的两种实现&#xff1a;懒汉模式和饿汉模式&#xff0c;今天我们以新的方式来实现可复用的单例模式。 奇异递归模板是指父类是个模板类&#xff0c;模板类型是子类类型&#xff0c;即父类通过模板参数可以知道子类的类型。 // brief: a singleton base…...

微信小程序 - 龙骨图集拆分

微信小程序 - 龙骨图集拆分 注意目录结构演示动画废话一下业务逻辑注意点龙骨JSON图集结构 源码分享dragonbones-split.jsdragonbones-split.jsondragonbones-split.wxmldragonbones-split.wxssimgUtil.js 参考资料 注意 只支持了JSON版本 目录结构 演示动画 Spine播放器1.5.…...

使用React 18和WebSocket构建实时通信功能

1. 引言 WebSocket是一种在Web应用中实现双向通信的协议。它允许服务器主动向客户端推送数据&#xff0c;而不需要客户端发起请求。在现代的实时应用中&#xff0c;WebSocket经常用于实时数据传输、聊天功能、实时通知和多人协作等场景。在本篇博客中&#xff0c;我们将探索如…...

vue3使用vue-router嵌套路由(多级路由)

文章目录 1、Vue3 嵌套路由2、项目结构3、编写相关页面代码3.1、编写route文件下 index.ts文件3.2、main.ts文件代码&#xff1a;3.3、App.vue文件代码&#xff1a;3.4、views文件夹下的Home文件夹下的index.vue文件代码&#xff1a;3.5、views文件夹下的Home文件夹下的Tigerhh…...

openGauss学习笔记-164 openGauss 数据库运维-备份与恢复-导入数据-使用COPY FROM STDIN导入数据-处理错误表

文章目录 openGauss学习笔记-164 openGauss 数据库运维-备份与恢复-导入数据-使用COPY FROM STDIN导入数据-处理错误表164.1 操作场景164.2 查询错误信息164.3 处理数据导入错误 openGauss学习笔记-164 openGauss 数据库运维-备份与恢复-导入数据-使用COPY FROM STDIN导入数据-…...

QT Widget - 随便画个圆

简介 实现在界面中画一个圆, 其实目的是想画一个LED效果的圆。代码 #include <QApplication> #include <QWidget> #include <QPainter> #include <QColor> #include <QPen>class LEDWidget : public QWidget { public:LEDWidget(QWidget *pare…...

js输入框部分内容不可编辑,其余正常输入,el-input和el-select输入框和多个下拉框联动后的内容不可修改

<tr>//格式// required自定义指令<e-td :required"!read" label><span>地区&#xff1a;</span></e-td><td>//v-if"!read && this.data.nationCode 148"显示逻辑<divclass"table-cell-flex"sty…...

分布式文件存储系统minio了解下

什么是minio minio 是一个基于 Apache License v2.0 开源协议的对象存储服务。非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小。 是一种海量、安全、低成本、高可靠的云存储…...

迅为RK3568开发板使用OpenCV处理图像-ROI区域-位置提取ROI

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区域&#xff08;Region of Interest, ROI&#xff09;。在设定感兴趣区域 ROI 后&#xff0c;就可以对该区域进行整体操作。 位置提取 ROI 本小节代码在配套资料“iTOP-3…...

网站怎么做才 吸引人/网站关键词排名优化电话

plsql 查询结果窗口 不正常 无法更新&#xff01;&#xff01;&#xff01;&#xff01; kkdengdai123 |浏览 2446 次 2015-03-24 11:252016-06-23 16:26 最佳答案你的sql语句中有全角字符的空格&#xff0c;你需要把它删除掉&#xff0c;换成半角字符的空格就好了...

长春企业做网站/线上电脑培训班

问题背景 版本HslCommunication.5.3.3型号FX3U 16M、FX3U 48M软件C# Windows程序报错接口 HslCommunication.Profinet.Melsec.MelsecFxSerial; public virtual OperateResult Write(string address, ushort value); 接口内部报错内容 未将对象引用设置到对象的示例。操作…...

wordpress qq登陆/抖音代运营大概多少钱一个月

在线免费小说平台小程序功能演示...

专门卖电子产品的网站/在线网页制作网站

安装mod_passenger http://passenger.stealthymonkeys.com/rhel/6/ http://www.cactifans.org/linux/994.htm l 本文转自1321385590 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/linux10000/1749495&#xff0c;如需转载请自行联系原作者...

青岛网景互联网站建设公司/活动营销推广方案

CREATE DATABASE voyager; CREATE DATABASE voyager; CREATE USER doglocalhost IDENTIFIED BY 123456; GRANT ALL ON voyager.* TO doglocalhost; 转载于:https://www.cnblogs.com/carious/p/9960063.html...

wordpress表白墙/微信信息流广告投放

2019独角兽企业重金招聘Python工程师标准>>> 简介&#xff1a; RequestMapping RequestMapping是一个用来处理请求地址映射的注解&#xff0c;可用于类或方法上。用于类上&#xff0c;表示类中的所有响应请求的方法都是以该地址作为父路径。 RequestMapping注解有六…...