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

20个Golang最佳实践

在本教程中,我们将探讨 Golang 中的 20 个最佳编码实践。它将帮助您编写有效的 Go 代码。

#20:使用正确的缩进
良好的缩进使您的代码具有可读性。一致地使用制表符或空格(最好是制表符)并遵循 Go 标准缩进约定。

package main 

import "fmt" 

func main() { 
for i := 0; i<5;i++ { 
fmt.Println("你好,世界!") 

}

运行gofmt以根据 Go 标准自动格式化(缩进)您的代码。

$ gofmt -w your_file.go

#19:正确导入包
仅导入您需要的包,并格式化导入部分以对标准库包、第三方包和您自己的包进行分组。

#18:使用描述性变量和函数名称

  1. 有意义的名称:使用传达变量用途的名称。
  2. CamelCase:以小写字母开头,并将名称中每个后续单词的第一个字母大写。
  3. 短名称:对于作用域较小的短期变量来说,短而简洁的名称是可以接受的。
  4. 无缩写:避免使用晦涩的缩写和首字母缩略词,而使用描述性名称。
  5. 一致性:在整个代码库中保持命名一致性。

package main 

import "fmt" 

func main() { 
// 声明具有有意义名称的变量
userName := "John Doe" // 驼峰式命名法:以小写字母开头,后续单词大写。
itemCount := 10 // 短名称:对于小范围变量来说短而简洁。
isReady := true // 无缩写:避免使用神秘的缩写或首字母缩略词。

    // 显示变量值
fmt.Println("User Name:", userName) 
fmt.Println("Item Count:", itemCount) 
fmt.Println("Is Ready:", isReady) 

// 在包级别使用混合大小写变量
var ExportVariable int = 42 

// 函数名称应该是描述性的
funccalculateSumOfNumbers(a, b int) int { 
return a + b 

// 一致性:在整个代码库中保持命名一致性。

#17:限制线长度
尽可能将代码行控制在 80 个字符以下,以提高可读性。
package main

import (
"fmt"
"math"
)

func main() {
result := calculateHypotenuse(3, 4)
fmt.Println("Hypotenuse:", result)
}

func calculateHypotenuse(a, b float64) float64 {
return math.Sqrt(a*a + b*b)
}

#16:使用常量表示魔法值
避免在代码中使用魔法值。魔法值是分散在代码中的硬编码数字或字符串,缺乏上下文,因此很难理解它们的用途。为它们定义常量以使您的代码更易于维护。

package main 

import "fmt" 

const ( 
// 定义一个最大重试次数的常量
MaxRetries = 3 

    // 定义一个以秒为单位的默认超时常量
DefaultTimeout = 30 

func main() { 
retries := 0 
timeout := DefaultTimeout 

    for retries < MaxRetries { 
fmt.Printf("尝试操作(重试 %d),超时:%d 秒\n", retries+1, timeout) 

// ... 这里是您的代码逻辑 ... 

        retries++ 

}

#15:错误处理
Go 鼓励开发人员显式处理错误,原因如下:

  1. 安全性:错误处理确保意外问题不会导致程序突然崩溃或崩溃。

  2. 清晰度:显式的错误处理使您的代码更具可读性,并有助于识别可能发生错误的位置。

  3. 调试:处理错误为调试和故障排除提供了有价值的信息。

让我们创建一个简单的程序来读取文件并正确处理错误:

package main 

import ( 
"fmt" 
"os" 

func main() { 
// 打开文件
file, err := os.Open("example.txt") 
if err != nil { 
// 处理错误
fmt.Println ("打开文件时出错:", err) 
return 

defer file.Close() // 完成后关闭文件

// 从文件
buffer := make([]byte, 1024) 
_, err = file.Read (buffer) 
if err != nil { 
// 处理错误
fmt.Println("读取文件时出错:", err) 
return 

// 打印文件内容
fmt.Println("文件内容:", string(buffer) ) 
}

#14:避免使用全局变量
尽量减少全局变量的使用。全局变量会导致不可预测的行为,给调试带来挑战,并妨碍代码的重复使用。全局变量还会在程序的不同部分之间引入不必要的依赖关系。取而代之的是,通过函数参数和返回值来传递数据。

让我们编写一个简单的 Go 程序来说明避免使用全局变量的概念:

package main 

import ( 
"fmt" 

func main() { 
// 在主函数中声明并初始化变量
message := "Hello, Go!" 

// 调用使用局部变量的函数
printMessage(message) 

// printMessage 是一个带有参数的函数
func printMessage(msg string) { 
fmt.Println(msg) 
}

#13:使用结构来处理复杂数据
使用结构将相关数据字段和方法分组在一起。它们允许您将相关变量分组在一起,使您的代码更有组织性和可读性。
下面是一个完整的示例程序,演示了 Go 中结构体的使用:

package main 

import ( 
"fmt" 

// 定义一个名为Person的结构体来表示一个人的信息。
type Person struct { 
FirstName string // 人的名字
LastName string // 人的姓
Age int // 人的年龄

func main() { 
// 创建 Person 结构体的实例并初始化其字段。
person := Person{ 
FirstName: "John", 
LastName: "Doe", 
Age: 30, 

    // 访问并打印结构体字段的值。
fmt.Println("First Name:", person.FirstName) // 打印名字
fmt.Println("Last Name:", person.LastName) // 打印姓氏
fmt.Println("Age:", person.Age ) // 打印年龄
}

#12:评论你的代码
添加注释来解释代码的功能,尤其是对于复杂或不明显的部分。

单行注释
单行注释以//. 使用它们来解释特定的代码行。

package main 

import "fmt" 

func main() { 
// 这是一个单行注释
fmt.Println("Hello, World!") // 打印一条问候语
}

多行注释
多行注释包含在/* */. 使用它们进行跨多行的较长解释或注释。

package main 

import "fmt" 

func main() { 
/*
这是多行注释。
它可以跨越多行。
*/ fmt.Println("Hello, World!") // 打印问候语
}

功能注释
向函数添加注释以解释其用途、参数和返回值。使用“ godoc”样式进行函数注释。

package main 

import "fmt" //greetUser 通过名字向用户打招呼。
// 参数:
// name(字符串):要问候的用户的名称。
// 返回:
_// string:问候消息。_funcgreetUser(name string) string { 
return "你好," + name + "!" } 

func main() { 
userName := "Alice" greeting:=greetUser(userName) 
fmt.Println(greeting) 
}

#11:使用 goroutine 实现并发
利用 goroutine 高效地执行并发操作。Goroutines 是 Go 中的轻量级并发执行线程。它们使您能够同时运行函数,而无需传统线程的开销。这使您可以编写高度并发且高效的程序。

让我们用一个简单的例子来演示这一点:

package main 

import
"fmt" "time" ) // 并发运行的函数
func printNumbers() { 
for i := 1; 我 <= 5;i++ { 
fmt.Printf("%d ", i) 
time.Sleep(100 * time.Millisecond) 

} _// 在主协程中运行的函数_func main() { _// 启动协程_go printNumbers() //继续执行main
for i := 0; 我<2;i++ { 
fmt.Println("Hello") 
time.Sleep(200 * time.Millisecond) 
} // 确保 goroutine 在退出之前完成
time.Sleep(1 * time.Second) 
}

#10:使用恢复处理恐慌
使用该recover函数可以优雅地处理恐慌并防止程序崩溃。在 Go 中,恐慌是意外的运行时错误,可能会导致程序崩溃。然而,Go 提供了一种称为recover优雅处理恐慌的机制。

让我们用一个简单的例子来演示这一点:

package main 

import "fmt" _// 可能会发生恐慌的函数_funcriskyOperation() { 
defer func() { 
if r := receive(); r != nil { // 从恐慌中恢复并优雅地处理它 fmt.Println("从恐慌中恢复:", r) 

}() // 模拟恐慌情况
panic("哎呀!出了点问题。") 

func main() { 
fmt.Println("程序开始。") // 在从恐慌中恢复的函数中调用有风险的操作
riskyOperation() 

fmt.Println("程序结束。") 
}

#9:避免使用“init”函数
除非必要,否则避免使用init函数,因为它们会使代码更难以理解和维护。

更好的方法是将初始化逻辑移动到您显式调用的常规函数​​中,通常是从函数中调用main。这可以让您更好地控制、增强代码可读性并简化测试。

这是一个简单的 Go 程序,演示了避免init函数:

package main 

import
"fmt" ) _// InitializeConfig 初始化配置。_func InitializeConfig() { // 在此初始化配置参数。
fmt.Println("正在初始化配置...") 
} _// InitializeDatabase 初始化数据库连接。_func InitializeDatabase() { // 在此初始化数据库连接。
fmt.Println("初始化数据库...") 

func main() { _// 显式调用初始化函数。_InitializeConfig() 
InitializeDatabase() // 这里是您的主要程序逻辑。
fmt.Println("主程序逻辑...") 
}

#8:使用 Defer 进行资源清理
defer允许您延迟函数的执行,直到周围的函数返回。它通常用于关闭文件、解锁互斥体或释放其他资源等任务。

这可以确保即使存在错误也能执行清理操作。

让我们创建一个从文件中读取数据的简单程序,我们将使用它defer来确保文件正确关闭,无论可能发生任何错误:

package main 

import
"fmt" "os" ) 

func main() { // 打开文件(将“example.txt”替换为你的文件名)
file, err := os.Open("example.txt") 
if err != nil { 
fmt.Println("Error opening the file:", err) 
return // 出错时退出程序
defer file.Close() // 确保函数退出时关闭文件

// 读取并打印文件内容
data := make([]byte, 100) 
n, err := file.Read(data) 
if err != nil { 
fmt.Println("读取文件时出错:", err) 
return // 退出程序出错

fmt.Printf("Read %d bytes: %s\n", n, data[:n]) 
}

#7:更喜欢复合文字而不是构造函数
使用复合文字来创建结构实例而不是构造函数。

为什么使用复合文字?
复合文字有几个优点:

  • 简明

  • 可读性

  • 灵活性

让我们用一个简单的例子来演示这一点:

package main 

import
"fmt" ) // 定义一个表示人的结构类型 type Person struct { 
FirstName string _// 人的名字_LastName string _// 人的姓_Age int // 人的年龄

func main () { _// 使用复合文字创建 Person 实例_person := Person{ 
FirstName: "John", // 初始化 FirstName 字段 LastName: "Doe", // 初始化 LastName 字段 Age: 30, // 初始化the Age 字段} // 打印人员信息
fmt.Println("Person Details:") 
fmt.Println("First Name:", person.FirstName) // 访问并打印 First Name 字段
fmt.Println("Last Name :", person.LastName) // 访问并打印姓氏字段
fmt.Println("Age:", person.Age) // 访问并打印年龄字段
}

#6:最小化函数参数
在 Go 中,编写干净、高效的代码至关重要。实现此目的的一种方法是最大限度地减少函数参数的数量,这可以使代码更易于维护和可读。

让我们用一个简单的例子来探讨这个概念:

package main 

import "fmt" _// 保存配置选项的 Option 结构_type Option struct { 
Port int 
Timeout int 
} // ServerConfig 是一个接受 Option 结构的函数
func ServerConfig(opt Option) { 
fmt.Printf("服务器配置 - Port : %d, Timeout: %d 秒\n", opt.Port, opt.Timeout) 

func main() { // 使用默认值创建 Option 结构体 defaultConfig := Option{ 
Port: 8080, 
Timeout: 30, 
} // 使用默认选项配置服务器 ServerConfig(defaultConfig) // 使用新的 Option struct customConfig 修改端口 := Option{ 
Port: 9090, 
} // 使用自定义端口值和默认超时配置服务器 ServerConfig(customConfig) 
}

在此示例中,我们定义一个Option结构体来保存服务器的配置参数。我们没有将多个参数传递给ServerConfig函数,而是使用单个Option结构,这使得代码更易于维护和扩展。当您的函数具有大量配置参数时,此方法特别有用。

#5:为了清晰起见,使用显式返回值而不是命名返回值
命名返回值在 Go 中常用,但有时会使代码不太清晰,尤其是在较大的代码库中。

让我们用一个简单的例子来看看区别。

package main 

import "fmt" _//namedReturn 演示命名返回值。_func nameReturn(x, y int) (result int) { 
result = x + y 
return 
} _//explicitReturn 演示显式返回值。_func ExplicitReturn(x, y int) int
return x + y 

func main() { // 命名返回值 sum1 := nameReturn(3, 5) 
fmt.Println("Named Return:", sum1) // 显式返回值 sum2 :=explicitReturn(3, 5) 
fmt.Println("显式返回:", sum2) 
}

在上面的示例程序中,我们有两个函数namedReturn和explicitReturn。它们的区别如下:

  • namedReturn使用命名的返回值result。尽管函数返回的内容很清楚,但在更复杂的函数中可能不会立即明显。

  • explicitReturn直接返回结果。这更简单、更明确。

#4:将函数复杂性降至最低
函数复杂性是指函数代码内的复杂程度、嵌套和分支程度。保持较低的函数复杂性可以使代码更具可读性、可维护性并且不易出错。

让我们用一个简单的例子来探讨这个概念:

package main 

import
"fmt" ) _//CalculateSum 返回两个数字的和。_funcCalculateSum(a, b int) int
return a + b 
} // PrintSum 打印两个数字的和。
func PrintSum() { 
x := 5 
y := 3 
sum :=CalculateSum(x, y) 
fmt.Printf("%d 和 %d 的和为 %d\n", x, y, sum) 

func main () { // 调用 PrintSum 函数来演示最小的函数复杂性。
PrintSum() 
}

在上面的示例程序中:

  1. 我们定义了两个具有特定职责的函数CalculateSum和。PrintSum
  2. CalculateSum是一个计算两个数字之和的简单函数。
  3. PrintSum用于CalculateSum计算并打印 5 和 3 的和。
  4. 通过保持函数简洁并专注于单个任务,我们保持了较低的函数复杂性,提高了代码的可读性和可维护性。

#3:避免变量的阴影
当在较窄的范围内声明具有相同名称的新变量时,会发生变量隐藏,这可能会导致意外行为。它隐藏了具有相同名称的外部变量,使其在该范围内无法访问。避免在嵌套作用域内隐藏变量以防止混淆。

让我们看一个示例程序:

package main 

import "fmt" func main() { // 声明并初始化外部变量 'x',值为 10。 x := 10 
fmt.Println("Outer x:", x) // 输入内部作用域一个新变量“x”遮蔽了外部“x”。 if true
x := 5 // 这里发生阴影 fmt.Println("Inner x:", x) // 打印内部 'x',即 5。 } // 外部 'x' 保持不变,仍然是无障碍。 fmt.Println("Outer x after inside scope:", x) // 打印外部 'x',即 10。
}

#2:使用接口进行抽象
抽象
抽象是 Go 中的一个基本概念,允许我们在不指定实现细节的情况下定义行为。

接口
在 Go 中,接口是方法签名的集合。

任何隐式实现接口所有方法的类型都满足该接口。

这使我们能够编写可以与不同类型一起使用的代码,只要它们遵循相同的接口即可。

下面是 Go 中的一个示例程序,演示了使用接口进行抽象的概念:

package main

import (
"fmt" "math"
)

// Define the Shape interface
type Shape interface {
Area() float64
}

// Rectangle struct
type Rectangle struct {
Width  float64
Height float64
}

// Circle struct
type Circle struct {
Radius float64
}

// Implement the Area method for Rectangle
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}

// Implement the Area method for Circle
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}

// Function to print the area of any Shape
func PrintArea(s Shape) {
fmt.Printf("Area: %.2f\n", s.Area())
}

func main() {
rectangle := Rectangle{Width: 5, Height: 3}
circle := Circle{Radius: 2.5} // Call PrintArea on rectangle and circle, both of which implement the Shape interface PrintArea(rectangle) // Prints the area of the rectangle PrintArea(circle) // Prints the area of the circle
}

在这个程序中,我们定义了 Shape 接口,创建了两个结构体 Rectangle 和 Circle,每个结构体都实现了 Area() 方法,并使用 PrintArea 函数打印任何满足 Shape 接口的形状的面积。

这演示了如何在 Go 中使用接口进行抽象,从而使用一个通用接口处理不同的类型。

#1:避免将库包和可执行文件混在一起
在 Go 中,保持包与可执行文件之间的明确分离至关重要,以确保代码的整洁和可维护性。

下面的示例项目结构展示了库和可执行文件的分离:

myproject/
├── main.go
├── myutils/
└── myutils.go

myutils/myutils.go:

// Package declaration - Create a separate package for utility functionspackage myutils

import "fmt"

// Exported function to print a message
func PrintMessage(message string) {
fmt.Println("Message from myutils:", message)
}
main.go:

// Main programpackage main

import ( "fmt" "myproject/myutils" // Import the custom package)

func main() {
message := "Hello, Golang!" // Call the exported function from the custom package myutils.PrintMessage(message) // Demonstrate the main program logic fmt.Println("Message from main:", message)
}

在上例中,我们有两个独立的文件:myutils.go 和 main.go。

  • myutils.go 定义了一个名为 myutils 的自定义软件包。它包含一个导出函数 PrintMessage,用于打印一条信息。
  • main.go 是使用相对路径("myproject/myutils")导入自定义软件包 myutils 的可执行文件。
  • main.go 中的主函数调用 myutils 软件包中的 PrintMessage 函数并打印一条消息。这种分工使代码井井有条,易于维护。 https://www.jdon.com/69800.html

相关文章:

20个Golang最佳实践

在本教程中&#xff0c;我们将探讨 Golang 中的 20 个最佳编码实践。它将帮助您编写有效的 Go 代码。 #20&#xff1a;使用正确的缩进 良好的缩进使您的代码具有可读性。一致地使用制表符或空格&#xff08;最好是制表符&#xff09;并遵循 Go 标准缩进约定。 package main …...

Java 类之 java.lang.System

Java 类之 java.lang.System 文章目录 Java 类之 java.lang.System一、简介二、主要功能1、currentTimeMillis() - 获取当前时间的毫秒数说明代码示例 2、getProperty(String key) - 获取系统属性说明代码示例 3、exit(int status) - 终止虚拟机说明代码示例 4、arraycopy(Obje…...

认识Modbus通信协议(笔记)

Modbus 莫迪康 1979年 PLC 1969年 什么是modbus&#xff1f; 它是一个Bus&#xff0c;即总线协议。比如串口协议、IIC协议、SPI都是通信协议。 协议&#xff0c;顾名思义是一种规定和约束 Modbus协议是一种引用层的报文传输协议&#xff0c;RTU、ASCLL、TCP,都属于Modbus协…...

【算法】距离(最近公共祖先节点)

题目 给出 n 个点的一棵树&#xff0c;多次询问两点之间的最短距离。 注意&#xff1a; 边是无向的。所有节点的编号是 1,2,…,n。 输入格式 第一行为两个整数 n 和 m。n 表示点数&#xff0c;m 表示询问次数&#xff1b; 下来 n−1 行&#xff0c;每行三个整数 x,y,k&am…...

基于SpringBoot的SSMP整合案例(消息一致性处理与表现层开发)

消息一致性处理 在后端执行完相应的操作后&#xff0c;我们需要将执行操作后的结果与数据返回前端&#xff0c;前端 调用我们传回去的数据&#xff0c;前端是如何知道我们传回去的数据名称的&#xff1f; 答&#xff1a;前后端遵循了同一个"协议"。这个协议就是定义…...

c#之反射详解

总目录 文章目录 总目录一、反射是什么&#xff1f;1、C#编译运行过程2、反射与元数据3、反射的优缺点 二、反射的使用1、反射相关的类和命名空间1、System.Type类的应用2、System.Activator类的应用3、System.Reflection.Assembly类的应用4、System.Reflection.Module类的应用…...

synchronized jvm实现思考

底层实现时&#xff0c;为什么使用了cxq队列和entryList双向链表&#xff1f;这里为什么不跟AQS中使用一个队列就行了&#xff0c;加了一个entryList的目的是为了什么&#xff1f; 个人理解这里多一个entryList&#xff0c;可能是用于减少频繁的cas操作。假设存在很多锁竞争时&…...

【hive基础】hive常见操作速查

文章目录 一. hive变量操作1. 查看当前hive配置信息2. 设置变量3. 修改变量4. 进入hive终端重新加载配置 二. 执行hive sql三. 启动hive 一. hive变量操作 1. 查看当前hive配置信息 # 查看当前所有配置信息 hive > set ;# 查看某一项配置信息 hive >set hive.metastore…...

2024年山东省职业院校技能大赛中职组“网络安全”赛项竞赛试题-A

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A 一、竞赛时间 总计&#xff1a;360分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略设置 A-3 流量完整性保护 A-4 …...

基于51单片机电子钟温度计数码显示设计( proteus仿真+程序+设计报告+讲解视频)

这里写目录标题 ✅1.主要功能&#xff1a;✅讲解视频&#xff1a;✅2.仿真设计✅3. 程序代码✅4. 设计报告✅5. 设计资料内容清单&&下载链接✅[资料下载链接&#xff1a;](https://docs.qq.com/doc/DS0Nja3BaQmVtWUpZ) 基于51单片机电子钟温度检测数码显示设计( proteu…...

jenkins+centos7上传发布net6+gitlab

工作中实践了一下jenkins的操作&#xff0c;所以记录一下这次经验&#xff0c;没有使用到docker 先看下成果&#xff1a; 选择发布项目 选择要发布的分支 构建中 发布成功 开始 首先安装好jenkins并注册自己的jenkins账号 因为我们的项目代码管理使用的是gitlab&#xff0c…...

python趣味编程-5分钟实现一个F1 赛车公路游戏(含源码、步骤讲解)

Python 中的 F1 赛车公路游戏及其源代码 F1 Race Road Game是用Python编程语言开发的,它是一个桌面应用程序。 这款 Python 语言的 F1 赛道游戏可以免费下载开源代码,它是为想要学习 Python 的初学者创建的。 该项目系统使用了 Pygame 和 Random 函数。 Pygame 是一组跨平…...

Kafka快速入门

文章目录 Kafka快速入门1、相关概念介绍前言1.1 基本介绍1.2 常见消息队列的比较1.3 Kafka常见相关概念介绍 2、安装Kafka3、初体验前期准备编码测试配置介绍 bug记录 Kafka快速入门 1、相关概念介绍 前言 在当今信息爆炸的时代&#xff0c;实时数据处理已经成为许多应用程序和…...

基于Pytorch的从零开始的目标检测

引言 目标检测是计算机视觉中一个非常流行的任务&#xff0c;在这个任务中&#xff0c;给定一个图像&#xff0c;你预测图像中物体的包围盒(通常是矩形的) &#xff0c;并且识别物体的类型。在这个图像中可能有多个对象&#xff0c;而且现在有各种先进的技术和框架来解决这个问…...

interview review

M: intrinsic matrix [ f x s c x 0 f y c y 0 0 1 ] \begin{bmatrix}f_x & s & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1\end{bmatrix} ​fx​00​sfy​0​cx​cy​1​ ​ ( c x , c y ) (c_x, c_y) (cx​,cy​): camera center in pixels ( f x , f y …...

layui表头多出一列(已解决)

问题描述 &#xff1a;layui表头多出来一列&#xff0c;但是表体没有内容&#xff0c;很影响美观。 好像是原本的表格有滚轮&#xff0c;我操作放大之后滚轮没有了&#xff0c;但是滚轮自带的表头样式还在&#xff0c; 之后手动把这个样式隐藏掉了&#xff0c;代码如下&#xf…...

​LeetCode解法汇总307. 区域和检索 - 数组可修改

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个数…...

Java源码分析:Guava之不可变集合ImmutableMap的源码分析

原创/朱季谦 一、案例场景 遇到过这样的场景&#xff0c;在定义一个static修饰的Map时&#xff0c;使用了大量的put()方法赋值&#xff0c;就类似这样—— public static final Map<String,String> dayMap new HashMap<>(); static {dayMap.put("Monday&q…...

详解自动化测试之 Selenium

目录 1. 什么是自动化 2.自动化测试的分类 3. selenium&#xff08;web 自动化测试工具&#xff09; 1&#xff09;选择 selenium 的原因 2&#xff09;环境部署 3&#xff09;什么是驱动&#xff1f; 4. 一个简单的自动化例子 5.selenium 常用方法 5.1 查找页面元素&…...

vue监听对象属性值变化

一、官方文档 二、实现方法 方法一、直接根据watch来监听 export default {data() {return {object: {username: ,password: }}},watch: {object.username(newVal, oldVal) {console.log(newVal, oldVal)}} }方法二&#xff1a;利用watch和computed来实现监听 利用computed定…...

Unicode编码的emoji表情如何在前端页面展示(未完成)

Unicode编码的emoji表情如何在前端页面展示 一、首先几个定义解决办法 一、首先几个定义 U1F601 和 0x1F601 表示同一个 Unicode 代码点&#xff0c;即笑脸 Emoji 的代码点。它们之间的区别在于表示方式和数据类型。 1.U1F601 是一种常见的表示方式&#xff0c;也称为 “U” 标…...

基于SSM的设备配件管理和设备检修系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

鸿蒙开发|鸿蒙系统项目开发前的准备工作

文章目录 鸿蒙项目开发的基本流程介绍鸿蒙项目开发和其他项目有什么不同成为华为开发者-注册和实名认证1.登录官方网站 鸿蒙项目开发的基本流程介绍 直接上图&#xff0c;简单易懂&#xff01; 整个项目的开发通过4个模块进行&#xff1a;开发准备、开发应用、运行调试测试和发…...

Evil靶场

Evil 1.主机发现 使用命令探测存活主机&#xff0c;80.139是kali的地址&#xff0c;所以靶机地址就是80.134 fping -gaq 192.168.80.0/242.端口扫描 开放80&#xff0c;22端口 nmap -Pn -sV -p- -A 192.168.80.1343.信息收集 访问web界面 路径扫描 gobuster dir -u http…...

第77题. 组合

原题链接&#xff1a;第77题. 组合 全代码&#xff1a; class Solution { private:vector<vector<int>> result; // 存放符合条件结果的集合vector<int> path; // 用来存放符合条件结果void backtracking(int n, int k, int startIndex) {if (path.size() …...

读书笔记:彼得·德鲁克《认识管理》第21章 企业与政府

一、章节内容概述 企业社会责任最重要的维度之一是政企关系。无论对于企业的顺利运作&#xff0c;还是对于政府的顺利运作&#xff0c;政企关系都至关重要。然而&#xff0c;重商主义典范和宪政主义典范这两种传统理论越来越不适应社会现实&#xff0c;越来越失效。虽然当前尚…...

C/C++疫情集中隔离 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C疫情集中隔离 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C疫情集中隔离 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 A同学12月初从国外回来&#xff0c;按照防疫要…...

052-第三代软件开发-系统监测

第三代软件开发-系统监测 文章目录 第三代软件开发-系统监测项目介绍系统监测 关键字&#xff1a; Qt、 Qml、 cpu、 内存、memory 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Language&#xff09;和 C 的强大功…...

向量矩阵范数pytorch

向量矩阵范数pytorch 矩阵按照某个维度求和&#xff08;dim就是shape数组的下标&#xff09;1. torch1.1 Tensors一些常用函数 一些安装问题cd进不去不去目录PyTorch里面_表示重写内容 在默认情况下&#xff0c;PyTorch会累积梯度&#xff0c;我们需要清除之前的值 范数是向量或…...

NVIDIA Jetson OTA升级

从 JetPack 4.4 开始,可以使用包管理工具升级到下一个 JetPack 版本。请按照以下步骤执行升级。 1,小版本升级 (如,从 JetPack 4.4 升级到 JetPack 4.4.1) 第一步: sudo apt update 第二步: apt list --upgradable 第三步: sudo apt upgrade更新完之后重新启动即可 …...

【算法】算法题-20231118

这里写目录标题 一、16.17. 连续数列二、合并两个有序数组&#xff08;力扣88&#xff09;三、存在重复元素&#xff08;217&#xff09;四、有效的字母异位词&#xff08;242&#xff09; 一、16.17. 连续数列 简单 给定一个整数数组&#xff0c;找出总和最大的连续数列&…...

某60区块链安全之整数溢出漏洞实战学习记录

区块链安全 文章目录 区块链安全整数溢出漏洞实战实验目的实验环境实验工具实验原理攻击过程分析合约源代码漏洞EXP利用 整数溢出漏洞实战 实验目的 学会使用python3的web3模块 学会以太坊整数溢出漏洞分析及利用 实验环境 Ubuntu18.04操作机 实验工具 python3 实验原理…...

图数据库Neo4J 中文分词查询及全文检索(建立全文索引)

Neo4j的全文索引是基于Lucene实现的&#xff0c;但是Lucene默认情况下只提供了基于英文的分词器&#xff0c;下篇文章我们在讨论中文分词器&#xff08;IK&#xff09;的引用&#xff0c;本篇默认基于英文分词来做。我们前边文章就举例说明过&#xff0c;比如我要搜索苹果公司&…...

element-china-area-data使用问题

使用CodeToText报错&#xff0c;下载的时候默认下载最新版本的&#xff0c; 稳定版本5.0.2版本才可以 npm install element-china-area-data5.0.2 -S...

248: vue+openlayers 以静态图片作为底图,并在上面绘制矢量多边形

第248个 点击查看专栏目录 本示例是演示如何在vue+openlayers项目中以静态图片作为底图,并在上面绘制矢量多边形。这里主要通过pixels的坐标作为投射,将静态图片作为底图,然后通过正常的方式在地图上显示多边形。注意的是左下角为[0,0]。 直接复制下面的 vue+openlayers源代…...

thinkphp6(TP6)访问控制器报404(Nginx)

起因&#xff1a; 安装thinphp6后&#xff0c;发现无法访问控制器&#xff0c;直接通过URL访问&#xff0c;就报错404。 错误原因&#xff1a; Nginx不支持URL的 PathInfo。 解决方法&#xff1a; 配置伪静态。 伪静态代码&#xff1a; location / {if (!-e $request_filen…...

腾讯云轻量应用服务器使用场景列举说明

腾讯云轻量应用服务器&#xff08;TencentCloud Lighthouse&#xff09;是新一代开箱即用、面向轻量应用场景的云服务器产品&#xff0c;轻量应用服务器可用于搭建中小型网站、Web应用、博客、论坛、小程序/小游戏、电商、云盘/图床、云端开发测试和学习环境等轻量级、中低负载…...

【漏洞复现】IP-guard WebServer 远程命令执行

漏洞描述 IP-guard是一款终端安全管理软件,旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。互联网上披露IP-guard WebServer远程命令执行漏洞情报。攻击者可利用该漏洞执行任意命令,获取服务器控制权限。 免责声明 技术文章仅供参考,任何个人和…...

23111704[含文档+PPT+源码等]计算机毕业设计springboot办公管理系统oa人力人事办公

文章目录 **软件开发环境及开发工具&#xff1a;****功能介绍&#xff1a;****实现&#xff1a;****代码片段&#xff1a;** 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 软件开发环境及开发工具&#xff1a; 前端技术&#xff1a;jsc…...

在Linux系统上检测GPU显存和使用情况

在Linux系统上&#xff0c;你可以使用一些命令行工具来检测GPU显存和使用情况。以下是一些常用的方法&#xff1a; 1. 使用nvidia-smi&#xff08;仅适用于NVIDIA GPU&#xff09; 如果你使用的是NVIDIA的显卡&#xff0c;你可以使用nvidia-smi命令来获取显卡信息&#xff0c…...

内网穿透 cpolar

通过 cpolar软件 可以获得一个临时域名&#xff0c;而这个临时域名是一个 公网ip 下载与安装 下载地址&#xff1a;https://dashboard.cpolar.com/get-started 安装过程中&#xff0c;一直下一步即可 验证 进入官网验证页面复制 authtoken打开 cmd 进入安装目录执行命令&#…...

ai剪辑矩阵系统源码+无人直播系统源码技术开发

开发AI剪辑矩阵系统和无人直播系统源码&#xff0c;需要以下步骤&#xff1a; 1. 市场调研&#xff1a;了解市场需求和竞品情况&#xff0c;明确系统的功能和特点。 2. 系统设计&#xff1a;设计系统的整体架构和功能模块&#xff0c;包括视频剪辑、直播推流、实时互动、数据分…...

2311rust,到38版本更新

1.35.0稳定版 此版本亮点是分别为Box<dyn FnOnce>,Box<dyn FnMut>和Box<dyn Fn>实现了FnOnce,FnMut和Fn闭包特征. 此外,现在可按不安全的函数指针转换闭包.现在也可无参调用dbg!. 为Box<dyn Fn*>实现Fn*装饰特征. 以前,如果要调用在盒子闭包中存储的…...

腾讯云4核8G服务器配置价格表,轻量和CVM标准型S5实例

腾讯云4核8G服务器S5和轻量应用服务器优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;腾讯云…...

Android 屏幕适配

目录 一、为什么要适配 二、几个重要的概念 2.1 屏幕尺寸 2.2 屏幕分辨率 2.3 屏幕像素密度 2.4 屏幕尺寸、分辨率、像素密度三者关系 三、常用单位 3.1 密度无关像素(dp) 3.2 独立比例像素&#xff08;sp&#xff09; 3.3 dp与px的转换 四、解决方案 4.1 今日头条…...

Python使用Mechanize库完成自动化爬虫程序

目录 引言 一、了解Mechanize库 二、安装Mechanize库 三、使用Mechanize库发送HTTP请求 四、使用Mechanize库解析HTML页面 五、使用Mechanize库模拟用户输入 六、使用Mechanize库处理JavaScript动态生成的内容 七、使用Mechanize库处理登录和表单提交的常见问题 总结 …...

【Shell脚本入门】

Shell中的特殊符号 1.$ 美元符号&#xff0c;用来表示变量的值。 如变量NAME的值为Mike&#xff0c;则使用$NAME就可以得到“Mike”这个值。2.# 井号&#xff0c;除了做为超级用户的提示符之外&#xff0c;还可以在脚本中做为注释的开头字母&#xff0c;每一行语句中&#xff…...

redis大全

redis-cli 常用命令 redis常用命令 redis数据结构 redis数据结构 redis持久化存储 持久化存储 redis事务 redis事务 redis管道 管道 redis7集群搭建 集群 redis常见问题以及解决方案 常见问题以及解决方案 redis面试题 面试题 redis高级案列case 高级case sp…...

linux rsyslog日志采集格式设定五

linux rsyslog日志采集格式设定五 1.创建日志接收模板 打开/etc/rsyslog.conf文件,在GLOBAL DIRECTIVES模块下任意位置添加以下内容 命令: vim /etc/rsyslog.conf 测试:rsyslog.conf文件结尾添加以下内容 $template ztj,"%fromhost-ip% %app-name% %syslogseveri…...

uni-app:如何配置uni.request请求的超时响应时间(全局+局部)

方法一&#xff1a;全局配置响应时间 一、进入项目的manifest.json的代码视图模块 二、写入代码 "networkTimeout": {"request": 5000 }, 表示现在request请求响应时间最多位5秒 方法二&#xff1a;局部设置响应时间 一、直接在uni.request中写入属性…...