【Go语言精进之路】构建高效Go程序:掌握变量、常量声明法则与iota在枚举中的奥秘

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

    • 引言
    • 一、变量
      • 1.1 基础知识
      • 1.2 包级变量的声明形式深入解析
        • 📌 声明并同时显式初始化
        • 📌 声明但延迟初始化
        • 📌 声明聚类与就近原则
      • 1.3 局部变量的声明形式深入探讨
        • 📌 延迟初始化的局部变量声明
        • 📌 显式初始化的局部变量与短变量声明
        • 📌 分支控制中的短变量声明
    • 二、常量
      • 2.1 Go语言常量溯源:从C语言到Go
        • 📌 C语言中的常量
        • 📌 Go语言中的常量进化
      • 2.2 有类型常量带来的烦恼
        • 📌 类型转换的显式性
        • 📌 限制通用性
        • 📌 类型错误的频繁出现
      • 2.3 无类型常量消除烦恼,简化代码
        • 📌 动态类型推导
        • 📌 增强通用性和代码复用
        • 📌 减少类型错误
    • 三、使用 iota 实现枚举常量
      • 3.1 基础用法:自动递增
      • 3.2 高级用法:表达式、继承、显式赋值、空标识符与重置
    • 四、总结

引言

Go 语言作为现代编程领域的重要成员,对变量和常量的处理体现了静态类型语言的精髓。本文深入剖析了 Go 语言中变量的基础知识、包级与局部变量的声明形式,以及常量的设计哲学与实践中的考量,旨在为开发者揭示 Go 在数据存储与类型管理方面的独特机制与优化策略。

在这里插入图片描述


一、变量

1.1 基础知识

变量是编程语言的基本构成元素,它们担当存储信息与实现数据操作的重任。Go语言中,变量声明是一项核心机制,深刻反映了语言本身的设计原则:追求简洁性、确保运行效率及强化代码的安全性。恰当的变量声明策略,对于提升程序代码的可读性、维护便捷性以及执行效能具有不可或缺的作用。

在这里插入图片描述

Go语言体系中,变量是存储数据的基本单元,其核心功能在于保存程序运行过程中的信息。每个变量都被赋予了特定的数据类型,这些类型涵盖了诸如整数(int)浮点数(float)字符串(string) 等多种基本类型以及其他复合类型。数据类型定义了变量能够存储值的范围和类型,确保了数据的准确性和一致性。

Go 作为一种静态类型语言,在程序编译阶段就要求明确指定每个变量的类型。这意味着:

  • 类型固定性:一旦为变量指定了一个类型,如intstring,该变量就只能存储该类型的数据,无法在程序运行过程中改变其类型。
  • 编译时检查:编译器会在编译阶段检查所有变量的使用是否符合其声明的类型,这样可以提前发现类型不匹配的错误,避免运行时出现意外行为。
  • 性能优势:由于类型在编译时已确定,编译器可以进行更多的优化,提升程序的执行效率。

例如,声明一个整型变量counter并赋值为10,其类型int在编译时就需要被明确指定,并且后续尝试给counter赋值为字符串将导致编译错误:

var counter int = 10
// counter = "This will not compile" // 错误:类型不匹配

这种静态类型的特性,促使开发者在编码初期就必须仔细考虑数据的表示,促进了代码的严谨性和可维护性。

Go中,变量除了按数据类型划分外,还可以根据其声明的位置和作用域分为两大类:包级变量局部变量

1.2 包级变量的声明形式深入解析

包级变量定义在包作用域内的变量,它们具有全局可见性,对包内的所有函数开放访问权限。这类变量通常用于存储那些在包的多个组件间共享的状态或配置信息。

📌 声明并同时显式初始化

当你希望变量在声明时即赋予一个具体的初始值,可以采用这种方式。这不仅明确了变量的用途,有时还能帮助减少因未初始化变量而引发的错误。

package mainvar version string = "1.0.0" // 包级变量声明并显式初始化为版本号
📌 声明但延迟初始化

在某些场景下,你可能知道某个变量将被使用,但其确切的初始化值在声明时刻还未知或不适合立即设定。此时,你可以先声明变量而不进行初始化Go会自动为这些变量赋予其类型的零值(如int的零值为0boolfalse等)。

var debugMode bool // 声明一个布尔型包级变量,初始化为false(零值)
📌 声明聚类与就近原则

Go允许在一个var声明中声明多个变量,这称为声明聚类,可以使得代码更为紧凑。此外,Go遵循就近原则,如果在更小的作用域内重新声明了同名变量,那么原始的包级变量在该作用域内将被遮蔽。

var (connectionTimeout time.Duration = 5 * time.Second // 初始化连接超时时间maxAttempts int = 3                        // 最大尝试次数// ...其他变量声明
)func handleRequest() {var maxAttempts int = 10 // 函数内重新声明maxAttempts,遮蔽包级变量// 此处的maxAttempts指的是局部变量10
}

在上面的例子中,handleRequest函数内部重新声明了一个名为maxAttempts的局部变量,这表明在该函数内部,maxAttempts引用的是局部变量10,而非包级变量3,展示了就近原则的应用。

1.3 局部变量的声明形式深入探讨

局部变量作为函数或代码块内部的存储单元,其生命期严格限定于声明它们的上下文内,这有助于保持代码的模块化和清晰度。接下来,我们将详细探讨局部变量的几种声明形式及其在实际编程中的应用策略。

📌 延迟初始化的局部变量声明

在某些情况下,你可能需要 先声明变量,稍后再根据逻辑流程决定其初始化值。这时,采用传统的var声明形式是合适的。

func calculateSum(numbers []int) int {var sum int // 声明局部变量sum但不立即初始化for _, number := range numbers {sum += number // 在循环中累加求和}return sum
}
📌 显式初始化的局部变量与短变量声明

Go推崇简洁性,特别是在类型可以从初始值直接推断的情况下,推荐使用短变量声明(:=)来声明并初始化局部变量。这种方式不仅减少了代码量,也增强了代码的可读性。

func greetUser(name string) {greeting := "Hello, " + name + "!" // 简洁声明并初始化fmt.Println(greeting)
}
📌 分支控制中的短变量声明

在条件语句或循环体中,利用短变量声明可以有效地管理临时变量,避免不必要的变量作用域扩散,使得代码更加紧凑且易于理解。

func processData(inputData map[string]int) {if value, exists := inputData["key"]; exists {// 使用value,已知存在} else {// 在else块内部声明新的value,避免污染外部作用域value := getDefaultData()// 处理defaultValue}
}func getDefaultData() int {return 0
}

总结而言,Go语言在局部变量声明上提供了丰富的机制,旨在提升代码的简洁性和执行效率。无论是通过传统的var声明进行延迟初始化,还是利用类型推断的短变量声明来简化代码,亦或是巧妙地在分支结构中应用短变量声明以增强代码逻辑的清晰度,都是为了帮助开发者编写出更加高效、易读、易维护的Go程序。


二、常量

2.1 Go语言常量溯源:从C语言到Go

在探索Go语言常量的设计理念之前,回顾一下C语言中的常量概念是十分有益的,因为C语言对许多现代编程语言的常量和变量处理方式有着深远的影响。

在这里插入图片描述

📌 C语言中的常量

C语言中,常量分为以下几类:

  • 字面常量:直接写在代码中的固定值,如5, "Hello, World!", true等,它们没有名字,直接用于表达式。
  • 符号常量:通过#define预处理器指令定义,给一个固定值赋予一个名字,如#define PI 3.14159。符号常量在编译前会被替换为对应的值,因此不占用运行时内存,也没有类型信息。

C语言的常量系统相对简单,但也存在一些局限性:

  • 类型不安全:符号常量(#define)本质上是一种文本替换,编译器不做类型检查,可能导致类型错误。
  • 缺乏类型灵活性:字面常量有固定的类型,而符号常量完全无类型,这限制了它们的使用场景。
  • 表达式能力有限:C语言的常量表达式在编译时计算的能力有限,不支持复杂的计算或类型推导。
📌 Go语言中的常量进化

Go 语言设计者在设计常量系统时,既借鉴了C语言的优点,也针对其局限性进行了改进:

  • 类型安全与灵活性Go中的常量通过const关键字声明,不仅支持基本类型,还可以是用户自定义类型。与C语言不同,Go的常量是有类型的,这保证了类型安全,同时允许在编译时进行类型推导和转换。

  • 强大的编译时计算能力Go支持在常量声明中使用几乎所有的算术和逻辑运算符,甚至支持位操作,使得编译时计算能力大大增强。这意味着可以在编译阶段完成更多工作,减少运行时负担。

  • iota与枚举Go引入了iota这个特殊的常量生成器,极大地简化了枚举类型的定义。iota在每个const声明块中自动递增,为创建有序的常量集合提供了一种简洁的方式。

  • 无类型常量与类型推导Go允许定义无类型常量,这些常量在使用时会根据上下文自动推断类型。这种机制既保留了灵活性,又保持了类型安全,减少了因类型转换带来的代码复杂度。

通过这些设计,Go语言的常量系统在继承C语言简单直接特性的基础上,进一步提升了类型安全、表达能力和编译时计算的灵活性,更好地满足了现代软件开发的需求。

2.2 有类型常量带来的烦恼

在编程语言的领域里,有类型常量(Typed Constants)扮演着双重角色:一方面,它们为程序设计引入了清晰的明确性,确保了数据的安全性;另一方面,在诸如 Go 或某些特定用途的 C++ 等类型系统严格的语言中,它们也带来了一系列潜在的挑战与烦恼。以下是几个关键方面的深入探讨。

📌 类型转换的显式性

有类型常量的一个核心烦恼在于跨类型操作时的显式类型转换需求。这意味着,当有类型常量参与不同数据类型间的运算或赋值时,程序员必须手动执行类型转换,以确保类型兼容性。这样做虽确保了类型安全,却可能增加代码的复杂度,尤其是在涉及多步骤计算或复杂表达式时。

package mainimport "fmt"func main() {const intConstant int = 42const floatConstant float64 = 3.14// 显示转换intConstant为float64以进行加法操作sum := floatConstant + float64(intConstant)fmt.Println(sum) // 输出: 45.14
}

此例中,即使目的很明确——将intConstantfloatConstant相加,也必须通过float64(intConstant)显式转换类型,增加了实现的繁琐度。

📌 限制通用性

有类型常量的另一个局限在于其固定性一旦定义了常量的类型,该类型便不可更改,这在一定程度上限制了常量在多上下文中的复用性。特别是在需要适应多种类型处理逻辑的场景,这可能导致需要定义多个相同值但类型不同的常量。

package mainimport ("fmt"
)func processIntValue(i int) {fmt.Println("Processing an integer:", i)
}func processFloatValue(f float64) {fmt.Println("Processing a float:", f)
}func main() {const myConst int = 10// 为了适应不同函数的参数类型,需要进行类型转换processFloatValue(float64(myConst)) // 需要转换
}

尽管myConst的值对于processIntValueprocessFloatValue都适用,但其定义为int类型,迫使我们在调用processFloatValue时进行类型转换,体现了类型固定性对通用性的影响。

📌 类型错误的频繁出现

在大型项目开发中,由于有类型常量严格类型约束,开发者在不恰当使用时容易遇到编译时类型不匹配的错误,尤其当常量被广泛应用时,此类错误的排查可能变得相当耗时且繁琐。

package mainimport ("fmt"
)const strConstant string = "GoLang"func expectsInt(i int) {fmt.Println("Received int:", i)
}func main() {// 这里尝试赋值会导致编译错误,因为类型不匹配// expectsInt(strConstant) 
}

尝试将strConstant(一个字符串类型常量)传递给期望整型参数的expectsInt函数,编译器会立即指出类型不匹配的错误,虽然这保障了类型安全,但也意味着在编写和维护时必须时刻警惕类型的一致性。

综上所述,有类型常量的这些“烦恼”实际上是类型安全机制的双刃剑,它们确保了程序的健壮性,但同时也对开发者提出了更高的要求,即在享受类型安全带来的好处的同时,也要妥善处理由此产生的额外复杂性。

2.3 无类型常量消除烦恼,简化代码

相较于有类型常量可能带来的种种挑战,无类型常量(Untyped Constants) 在Go语言中提供了一种更为灵活和简洁的解决方案,有效消除了上述烦恼,让代码编写和维护变得更加顺畅。

📌 动态类型推导

无类型常量最大的特点在于其能够在赋值或参与表达式时根据上下文自动推导类型,从而免去了显式类型转换的需要。这不仅减少了代码量,也提升了代码的可读性和维护性。

package mainimport "fmt"func main() {const untypedConst = 42 // 无类型常量// 自动推导为int类型intVar := untypedConstfmt.Println("As int:", intVar)// 自动推导为float64类型floatVar := untypedConst + 3.14fmt.Println("As float64:", floatVar)
}

在这个例子中,untypedConst作为无类型常量,既可以直接赋值给int类型的变量,也能参与浮点数运算自动转化为float64类型,大大简化了代码并提高了灵活性。

📌 增强通用性和代码复用

无类型常量的另一大优势在于其泛用性由于没有固定类型,它们可以在多种类型上下文中复用,无需为每个上下文单独定义类型化的常量,这对于需要跨类型共享相同基础值的场景尤为有用

package mainimport "fmt"func processAnyTypeValue[T any](v T) {fmt.Printf("Processing value of type %T: %v\n", v)
}func main() {const universalConst = 10 // 无类型常量// 直接用于不同类型的函数调用,无需转换processAnyTypeValue(universalConst)processAnyTypeValue(float64(universalConst)) // 显示转换示例,实际并不需要,仅展示灵活性
}

通过泛型函数processAnyTypeValue的演示,可以看到无类型常量universalConst能够轻松应用于各种类型参数,显著增强了代码的通用性和复用性。

📌 减少类型错误

由于无类型常量在使用时由编译器根据上下文自动推导类型,这在很大程度上减少了由于类型不匹配导致的编译错误。开发者不再需要担心因忘记类型转换而引发的错误,提高了开发效率和代码的稳定性。

通过以上分析与示例,可以看出,无类型常量通过其动态类型推导的特性,有效解决了有类型常量带来的类型转换显式性、通用性限制以及类型错误频繁出现等问题,从而简化了代码,提升了编程体验。在 Go 语言中明智地利用无类型常量,能够让我们编写出更加清晰、灵活和高效的代码。


三、使用 iota 实现枚举常量

Go 语言中,iota是一个非常特殊的常量生成器,它在常量定义中自动递增,为开发者提供了一种极其优雅的方式来定义枚举类型的常量序列。通过iota,我们可以避免手动指定每个常量的值,从而简化代码,减少错误,提高可读性。下面是iota在实现枚举常量中的应用细节和示例。

在这里插入图片描述

3.1 基础用法:自动递增

package mainimport "fmt"// 利用const关键字定义枚举常量,并利用iota实现自动递增
const (// 首个常量未直接指定值,iota默认从0开始Sunday = iotaMonday	  // 自动递增到1Tuesday   // 自动递增到2Wednesday // 自动递增到3Thursday  // 自动递增到4Friday    // 自动递增到5Saturday  // 自动递增到6
)func main() {fmt.Println("Sunday:", Sunday)     // 输出: Sunday: 0fmt.Println("Monday:", Monday)     // 输出: Monday: 1fmt.Println("Saturday:", Saturday) // 输出: Saturday: 6
}

这段代码展示了如何使用iota来定义枚举类型的常量。下面是对代码的简要说明和其输出结果的解释:

  • 定义枚举: 通过const关键字定义了一组表示星期的枚举常量。每个常量都隐式地被赋予了一个递增的整数值,起始于0,这是iota的默认行为。

  • iota的使用:

    • Sunday = iota 表示Sunday的值为0,因为这是iota第一次出现的地方,默认从0开始。
    • 随后,对于MondaySaturday,每遇到一个新的常量声明行,iota的值就自动递增1。因此,Monday是1,Tuesday是2,依此类推,直到Saturday为6。
  • 代码执行结果:

    • fmt.Println("Sunday:", Sunday) 输出 Sunday: 0
    • fmt.Println("Monday:", Monday) 输出 Monday: 1
    • fmt.Println("Saturday:", Saturday) 输出 Saturday: 6

这段代码简洁明了地展示了如何利用iota来避免为每个枚举值手动赋值,提高了代码的简洁性和维护性。这种枚举方式在Go语言中非常常见,尤其适用于那些需要定义一系列相关常量的场景。

3.2 高级用法:表达式、继承、显式赋值、空标识符与重置

package mainimport "fmt"const (Red = iota   // iota初始为0,所以Red的值为0  Green   // iota递增到1,所以Green的值为1 Blue	// iota递增到2,所以Blue的值为2Yellow = iota * 10	// iota此时为3,所以Yellow的值为3 * 10 = 30Purple	// iota此递增到4,由于没有显式赋值,所以继承上方的iota * 10规则,Purple的值为4 * 10 = 40Black = iota 	 // 显式赋值为iota,此时iota值为5,所以Black为5_                // 空标识符,表示忽略该值 6White = iota + 9 // iota为7,显式iota加9之后变为16_                // 16+1=17Cyan  = iota     // 重置为iota本身的值 9
)func main() {fmt.Println("Red:", Red) // 输出为0fmt.Println("Green:", Green)  // 输出为1fmt.Println("Blue:", Blue) // 输出为2fmt.Println("Yellow:", Yellow) // 输出为30fmt.Println("Purple:", Purple) // 输出为40fmt.Println("Black:", Black)  // 输出为5fmt.Println("White:", White) // 输出为16fmt.Println("Cyan:", Cyan) // 输出为9
}

在Go语言的const块中,iota是一个预定义的、只能在const声明中使用的计数器,初始值为0,并在每个const规范组(即没有新的const关键字开始的地方)的每行常量声明中递增。这种特性允许你创建一系列递增或基于特定规则的常量值。

在上述代码中,iota的用法展示了它的基本和高级特性:

  1. 初始化和递增

    • Red = iotaiota初始为0,所以Red的值为0。
    • Green:没有显式赋值,iota递增到1,所以Green的值为1。
    • Blue:同样,iota递增到2,Blue的值为2。
  2. 表达式和继承

    • Yellow = iota * 10:此时iota为3,所以Yellow的值为3 * 10 = 30
    • Purple:没有显式赋值,但由于Purple紧跟在Yellow之后,并且Yellow使用了iota * 10的表达式,所以Purple继承了这个表达式并使用当前的iota值(4)进行计算,得到4 * 10 = 40
  3. 显式赋值

    • Black = iota:这里明确地将Black赋值为当前的iota值,即5(因为Purple之后iota递增了)。
  4. 空标识符

    • _:空标识符用于忽略某个值。在这里,它用于跳过iota的当前值(6),而不将其分配给任何常量。
  5. 重置和再次递增

    • White = iota + 9:此时iota为7(因为_之后递增了),所以White的值为7 + 9 = 16
    • 紧接着的_再次使iota递增到8,但这个值被忽略了。
    • Cyan = iota:此时iota为9,所以Cyan的值为9。

注意,在 Go 中,const块中的iota块作用域的,即如果你开始一个新的const块(即新的一组常量声明,前面有const关键字),iota会被重置为0。但在同一个const块中,即使中间插入了其他非常量声明(如变量声明或函数声明),iota的递增也会继续。

此外,iota的使用通常用于创建一组逻辑上相关或按某种模式递增的常量值,使得代码更加清晰和易于维护。然而,过度使用或滥用iota可能会使代码难以阅读和理解,所以应该谨慎使用。


四、总结

Go语言在变量常量的处理上展现了其卓越的设计和强大的功能:

  • 通过静态类型系统Go 确保了变量声明的严谨性和类型安全,减少了运行时错误。包级变量局部变量的灵活声明方式,包括显式初始化和类型推断的短变量声明,不仅增强了代码的可读性和可维护性,还提高了执行效率。
  • 常量管理上,Go通过有类型常量无类型常量的结合,以及引入独特的iota计数器,为开发者提供了一种简洁而强大的枚举实现方式。iota的高级运用,如表达式结合、值重置和跳过特定值等,进一步丰富了枚举常量的定义方式,使Go 成为编写高质量、高性能软件的理想选择。

📌 变量声明与管理

  • Go语言通过静态类型系统强化了变量声明的严谨性,要求在编译阶段明确指定变量类型,从而确保了类型安全和早期错误检测。
  • 包级变量具有全局可见性,用于跨函数共享数据,可通过显式初始化或声明后赋零值来定义,支持在同一var语句中声明多个变量体现声明聚类。
  • 局部变量限于函数或代码块内,通过传统var声明、类型推断的短变量声明(:=)等方式灵活定义,增强了代码简洁性和执行效率,尤其是在分支控制中展现了短变量声明的价值。

📌 常量的演变与优化

  • C语言常量设计的回顾到Go语言的改进,突出了Go在常量系统上的进步,如类型安全、强大的编译时计算能力、以及通过iota实现的枚举简化。
  • 有类型常量虽然确保了数据的安全性和精确性,但可能伴随显式类型转换的繁琐、通用性受限及类型错误问题。
  • 无类型常量通过自动类型推导简化了代码,提高了灵活性和复用性,减轻了类型转换的负担,特别是在多类型上下文中展现了其价值。

📌 iota与枚举常量的高级运用

  • iota作为Go中独特的常量计数器,自动递增并在常量声明中提供了一种简洁的枚举实现方式,支持表达式结合、值重置、跳过特定值等高级特性。
  • 通过案例分析,展示了如何利用iota不仅实现基础的递增枚举,还能通过表达式定义复杂的枚举逻辑,如乘法增长、显式赋值重置iota计数等,极大丰富了枚举常量的定义方式和应用场景。

综上所述,Go 语言在变量和常量的处理上,通过静态类型系统灵活的声明形式、以及iota在枚举中的创新应用,体现了对代码清晰度、类型安全、执行效率的高度重视,同时也兼顾了开发者的便利性和编程的灵活性。这些特性共同支撑了 Go 语言成为编写高质量、高性能软件的优选工具。


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

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

相关文章

你认识nginx吗,nginx是做什么的,nginx可以做什么 --1)nginx介绍

一.Nginx 介绍 Nginx(发音同engine x)是一个异步框架的 Web 服务器,也可以用作反向代理,负载平衡器 和 HTTP 缓存。该软件由 Igor Sysoev 创建,并于2004年首次公开发布。同名公司成立于2011年,以提供支持。…

PHP:集成Xunsearch生成前端搜索骨架

如果是安装宝塔,我们在集成xunsearch的时候就会比较简单,后面我们在介绍其他的接入方式; 首先我们进入到宝塔管理后台:【软件商店】-【输入xun】-【点击xunsearch】直接安装即可 安装成功之后,会自动在www/server中创…

大模型高级 RAG 检索策略:自动合并检索

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

比较3维空间中4个点的不同结构

在4*4*4的3维空间中,取4个点共有635376种可能,有209个结构,继续按旋转对称分类则只有55个不同的结构。如其中的4t12 4个点在同一个平面,有1个点与其中的3个点不在同一行也不在同一列,这样的位置不止一个 这两个结构都是…

ubuntu系统下安装mysql的步骤详解

一、下载安装包 下载地址: https://dev.mysql.com/downloads/repo/apt 跳转到这个页面: 直接点击Download。 直接点击最下面的开始下载安装包即可。 二、将安装包下载到ubuntu系统中 先将用户切换成root用户,把下载好的安装包复制到桌面上&…

丛林生存法则其实就两个字:输出

不管你是在上班,还是在灵活就业,现在的大环境下,你要想活下来,生存下去,一定要记住这两个字:输出。如果你能记住更多的字,那便是持续高水平的输出。 你如果是大厂程序员,你肯定发现…

Linux DHCP server 配置

参考:linux dhcp配置多vlan ip_linux 接口vlan-CSDN博客 配置静态IP地址: 给固定的MAC地址分配指定的IP地址,固定的IP地址不必包含在指定的IP池中,如果包含在IP地址池中,固定的IP地址会从IP地址池中移除 配置方法&…

清洁力强的洗地机前十名排行榜:2024十大洗地机热销款式好用不踩雷

如今,洗地机行业竞争激烈,各品牌紧紧抓住用户对智能化和深度清洁的需求,深入研究创新。经过几轮行业内部的激烈竞争后,许多厂商在宣传中各说各的,对洗地机的重要参数描述不一,给消费者的选择带来了不少困惑…

【CVPR_2024】:逐元素乘积为什么会产生如此令人满意的结果?

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言论文重写星形运算一层网络推广多层网络特殊情况 W 1 W_1 W1​和/或 W 2 W_2 W2​…

JDK版本特性(JDK8\11\17\21版本)

JDK版本特性 Oracle官网https://www.oracle.com/java/technologies/java-se-support-roadmap.html Oracle官网中JDK版本的说明,Java SE 8、11、17和21是LTS版本。也就是长期支持版本。 我们针对这几个版本了解学习下对应版本的新特性。 JDK8版本 正式发布于2014…

Facebook的创新实验室:人工智能与新技术探索

Facebook作为全球领先的社交媒体平台之一,一直在不断探索和应用最新的技术来改善用户体验、推动创新和拓展业务边界。其创新实验室更是探索人工智能(AI)和新技术的前沿,为未来的社交媒体发展开辟了新的可能性。本文将深入探讨Face…

【题解 | 分享】2023年十四届蓝桥杯国赛(Java B组)

互质 答案:640720414 参考: public class Main {static int mod 1000000007;public static void main(String[] args) {long sum power(2023, 2023);long p1 ((sum % mod) * power( 7, mod - 2)) % mod;long p2 ((sum % mod) * power( 17, mod -…

【ZYNQ】SCU 与 GIC

在多 CPU 架构中,处理器之间可以对共享数据进行操作。Snoop control uint (SCU) 模块用于确保每个处理器都在最新的数据拷贝上运行,从而保持缓存一致性。通用中断控制器 Generic interrupt controller (GIC) 使用优先级的思想,管理 CPU 中断信…

Spring系统学习 - Spring入门

什么是Spring? Spring翻译过来就是春天的意思,字面意思,冠以Spring的意思就是想表示使用这个框架,代表程序员的春天来了,实际上就是让开发更加简单方便,实际上Spring确实做到了。 官网地址:ht…

【Mac】XMind for mac(XMind思维导图)v24.04.10311软件介绍和安装教程

软件介绍 XMind for Mac是一款功能强大的思维导图软件。它具有以下主要特点: 1.多样化的思维导图功能:XMind for Mac提供了丰富的思维导图编辑功能,用户可以创建各种类型的思维导图,包括组织结构图、逻辑图、时间轴图等&#xf…

fluent UI v9版本Dialog右上角x按钮聚焦问题解决

右上角x按钮聚焦效果展示 第一次点击不会聚焦,第二次或多次点击会出现这种情况。如果多个地方公用一个页面里,这个页面包含这个组件,那其它页面刚打开弹框就是聚焦状态,是个样式的问题。 解决: import * as React fr…

【Vue3】自定义组件directiveapp.use()

历史小剧场 崇祯很勤政,崇祯并非王国之君,弘光很昏庸,弘光活该倒霉,几百年来,我们都这样认为。 但我们之所以一直这样认为,只是因为有人这样告诉我们。 之所以有人这样告诉我们,是因为他们希望我…

比较与深浅克隆

1.比较 (1)Comparable接口:(重写compareTo方法) 由于它是一个接口,而且在这个接口中只有一个compareTo方法,所以所有实现该接口的类都需要重写。这个compareTo方法相当于制定一个比较标准&…

pyinstaller将py文件打包成exe

pyinstaller将py文件打包成exe 一、为什么需要将python文件打包成exe文件?二、具体操作步骤一、为什么需要将python文件打包成exe文件? python文件需要在python环境中运行,也就是需要安装python解释器。有时我们自己写的python程序需要分享给自己的朋友、同事或者合作伙伴,…

封装一个websocket,支持断网重连、心跳检测,拿来开箱即用

封装一个websocket,支持断网重连、心跳检测 代码封装 编写 WebSocketClient.js import { EventDispatcher } from ./dispatcherexport class WebSocketClient extends EventDispatcher {constructor(url) {console.log(url, urlurl)super()this.url url}// #soc…