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

【Go语言快速上手】第一部分:数据类型(数组、切片、映射)与控制语句

文章目录

  • 一、复合类型
    • Ⅰ 数组
      • 1. 语法
      • 2. 示例
      • 3. 特点
      • 4. 数组的传递
    • Ⅱ 切片
      • 1. 定义
      • 2. 语法
      • 3. 示例
      • 4. 特点
      • 5. 切片的创建
      • 6. 切片的操作
        • 切片的扩展
        • 切片的拷贝
    • Ⅲ 映射
      • 1. 定义
      • 2. 语法
      • 3. 示例
      • 4. 特点
      • 5. 映射的创建
      • 6. 映射的操作
        • 示例:插入、访问和删除
        • 判断键是否存在
        • 示例:判断键是否存在
        • 映射的遍历
    • Ⅳ 映射与数组、切片的区别
    • Ⅴ 结构体
      • 1. 结构体的定义
        • 示例:
      • 2. 创建和初始化结构体
      • 3. 结构体字段的访问
        • 访问结构体字段:
        • 通过指针访问结构体字段:
      • 4. 修改结构体字段
      • 5. 结构体作为函数参数
        • 传递结构体值:
        • 传递结构体指针:
      • 6. 结构体的嵌套
        • 示例:结构体嵌套
      • 7. 结构体与方法
        • 示例:为结构体定义方法
  • 二、控制流
    • `if` 语句
      • `if` 语句中的 `else if`
    • `for` 循环
      • 标准 `for` 循环
      • 无限循环
      • `range` 遍历
    • `switch` 语句
      • 基本语法
      • 省略 `expression`
      • 多个 `case` 合并
      • `fallthrough` 关键字

一、复合类型

Ⅰ 数组

数组是固定长度的序列,一旦定义其长度就不可更改。Go 中的数组是值类型,当我们将一个数组赋值给另一个数组时,会发生值拷贝

1. 语法

var arrayName [length]type

2. 示例

package mainimport "fmt"func main() {// 定义一个长度为5的整数数组var arr [5]intfmt.Println(arr) // [0 0 0 0 0]// 初始化数组arr2 := [3]int{1, 2, 3}fmt.Println(arr2) // [1 2 3]// 数组的长度是固定的,不能动态改变arr3 := [3]int{4, 5, 6}fmt.Println(len(arr3)) // 3
}

3. 特点

  1. 固定长度:数组一旦定义其长度就不能更改。
  2. 值类型:数组是值类型,赋值和传递数组会复制整个数组。
  3. 元素初始化:数组元素的默认值为零值(对于 int 类型来说是 0)。
  4. 内存连续:数组是一个内存连续的块,元素在内存中是连续存储的。

4. 数组的传递

由于 Go 中的数组是值类型,传递数组时会将整个数组拷贝一份到函数中。如果不希望这样,可以通过传递数组的指针来避免拷贝。

func modifyArray(arr [3]int) {arr[0] = 10
}func main() {arr := [3]int{1, 2, 3}modifyArray(arr)fmt.Println(arr) // [1 2 3],数组没有改变
}

如果传递指针:

func modifyArray(arr *[3]int) {arr[0] = 10
}func main() {arr := [3]int{1, 2, 3}modifyArray(&arr)fmt.Println(arr) // [10 2 3],数组被修改
}

Ⅱ 切片

切片是 Go 中的一个重要特性,是动态大小的数组。与数组不同,切片是引用类型,不会复制整个数据结构,而是指向底层数组的一部分。因此切片操作更加灵活高效。

1. 定义

切片是基于数组的一个引用类型,它没有固定的长度,可以动态增长。切片包含三个要素:指向底层数组的指针、切片的长度、切片的容量。

2. 语法

var sliceName []type

3. 示例

package mainimport "fmt"func main() {// 定义一个切片slice1 := []int{1, 2, 3}fmt.Println(slice1) // [1 2 3]// 使用 make 函数创建切片slice2 := make([]int, 5) // 创建一个长度为5的切片,默认值为0fmt.Println(slice2)       // [0 0 0 0 0]// 切片的容量fmt.Println(cap(slice2))  // 5fmt.Println(len(slice2))  // 5
}

4. 特点

  1. 动态大小:切片的长度可以动态改变,可以根据需要扩展。
  2. 引用类型:切片是引用类型,赋值和传递切片时是传递的底层数组的引用。
  3. 零值:切片的零值是 nil,并且没有分配内存空间。
  4. 可伸缩性:切片会根据需要动态扩展容量。
  5. 底层数组:切片实际上是对数组的一个视图,它是一个指向底层数组的指针,具有长度和容量。

5. 切片的创建

可以使用 make 函数创建切片:

slice := make([]int, 5)  // 创建一个长度为5的切片,默认值为零值(0)
slice := make([]int, 5, 10)  // 创建一个长度为5,容量为10的切片

6. 切片的操作

切片支持切片操作,可以从一个切片中提取子切片:

package mainimport "fmt"func main() {arr := []int{1, 2, 3, 4, 5}slice := arr[1:4] // 从 arr 中提取从索引 1 到索引 3 的部分,结果是 [2 3 4]fmt.Println(slice)
}

切片的操作并不会复制底层数组,只是引用了原数组的一部分。

切片的扩展

切片支持动态扩展,当切片的容量不足时,Go 会自动扩展切片的容量。扩展的规则通常是将容量翻倍。

package mainimport "fmt"func main() {slice := []int{1, 2, 3}slice = append(slice, 4)  // 添加元素到切片fmt.Println(slice)        // [1 2 3 4]
}
切片的拷贝

当我们想要拷贝一个切片时,可以使用 copy 函数。

package mainimport "fmt"func main() {slice1 := []int{1, 2, 3}slice2 := make([]int, len(slice1)) // 创建一个新的切片copy(slice2, slice1)               // 将 slice1 的内容拷贝到 slice2fmt.Println(slice2)                // [1 2 3]
}

Ⅲ 映射

1. 定义

映射是由键值对组成的集合,Go 中的映射是引用类型。每个键都对应一个值,且每个键在映射中是唯一的。如果使用一个已经存在的键进行赋值,旧的值将被替换。

2. 语法

var mapName map[keyType]valueType

其中,keyType 是映射的键的类型,valueType 是映射的值的类型。

3. 示例

package mainimport "fmt"func main() {// 创建一个映射,键为string类型,值为int类型var m map[string]intfmt.Println(m)  // 输出: nil,未初始化的映射是 nil// 初始化映射并添加元素m = make(map[string]int)m["age"] = 30m["score"] = 100fmt.Println(m)  // 输出: map[age:30 score:100]// 访问映射的值fmt.Println(m["age"]) // 输出: 30fmt.Println(m["score"]) // 输出: 100// 访问不存在的键fmt.Println(m["nonexistent"]) // 输出: 0,值的零值(int 类型的零值是 0)
}

4. 特点

  1. 无序性:映射中的键值对是无序的,在迭代映射时,元素的顺序是不确定的。
  2. 引用类型:映射是引用类型,赋值和传递映射时是传递的底层数据的引用。
  3. 键唯一:每个映射的键都是唯一的,不允许重复。如果给已有的键赋值,原来的值会被覆盖。
  4. 自动扩容:映射会根据元素的添加自动扩展。

5. 映射的创建

可以通过 make 函数来创建映射,make 函数接受两个参数:映射的键类型和映射的值类型。

// 创建一个空映射,键类型为string,值类型为int
m := make(map[string]int)

6. 映射的操作

  • 插入键值对:通过 map[key] = value 语法将键值对插入映射。
  • 访问值:通过 map[key] 语法访问映射中某个键对应的值。
  • 删除键值对:通过 delete(map, key) 函数删除某个键值对。
  • 判断键是否存在:通过 value, ok := map[key] 可以判断一个键是否存在。如果键存在,oktrue,否则为 false
示例:插入、访问和删除
package mainimport "fmt"func main() {m := make(map[string]int)// 插入元素m["apple"] = 5m["banana"] = 3fmt.Println(m)  // 输出: map[apple:5 banana:3]// 访问元素val, exists := m["apple"]if exists {fmt.Println("apple exists with value:", val)  // 输出: apple exists with value: 5}// 删除元素delete(m, "banana")fmt.Println(m)  // 输出: map[apple:5]
}
判断键是否存在

当访问映射时,如果键不存在,Go 会返回该值的零值(如 0""nil 等)。为了区分键是否存在,可以使用 comma ok 语法:

value, ok := m["key"]
  • 如果键存在,oktruevalue 为该键对应的值。
  • 如果键不存在,okfalsevalue 为该类型的零值。
示例:判断键是否存在
package mainimport "fmt"func main() {m := map[string]int{"apple": 5,"banana": 3,}// 判断 "apple" 是否存在val, exists := m["apple"]fmt.Println(val, exists) // 5 true// 判断 "grape" 是否存在val, exists = m["grape"]fmt.Println(val, exists) // 0 false
}
映射的遍历

Go 提供了 for range 语法来遍历映射中的键值对。

package mainimport "fmt"func main() {m := map[string]int{"apple": 5,"banana": 3,}// 遍历映射for key, value := range m {fmt.Println(key, value)}
}

输出结果可能类似于:

apple 5
banana 3

注意:映射的遍历顺序是不确定的,因为映射是无序的。


Ⅳ 映射与数组、切片的区别

  • 数组:固定长度、值类型、元素位置有序。
  • 切片:动态长度、引用类型、元素位置有序。
  • 映射:无固定顺序、引用类型、键值对唯一。

Ⅴ 结构体

1. 结构体的定义

结构体通过 type 关键字定义,通常每个字段都有一个名称和类型。定义结构体的基本语法如下:

type StructName struct {Field1 type1Field2 type2// 可以继续添加其他字段
}
示例:
type Person struct {Name    stringAge     intAddress string
}

这个 Person 结构体有三个字段:Name(字符串类型)、Age(整数类型)、Address(字符串类型)。每个字段都有一个名称和类型。

2. 创建和初始化结构体

在 Go 中,可以通过多种方式创建和初始化结构体。

方式 1:使用字面量初始化结构体

可以使用结构体字面量(即直接在定义时给字段赋值)来创建一个结构体对象:

package mainimport "fmt"type Person struct {Name    stringAge     intAddress string
}func main() {// 使用字面量创建并初始化结构体p := Person{Name:    "Alice",Age:     30,Address: "Wonderland",}fmt.Println(p)  // 输出: {Alice 30 Wonderland}
}

方式 2:使用默认值创建结构体

如果没有指定字段值,字段将使用类型的零值进行初始化(例如 string 类型为 ""int 类型为 0)。

package mainimport "fmt"type Person struct {Name    stringAge     intAddress string
}func main() {// 使用零值初始化结构体p := Person{}fmt.Println(p)  // 输出: { 0 }
}

方式 3:使用指针创建结构体

Go 中的结构体是值类型,意味着传递结构体时是将值复制。如果希望修改结构体的值,可以使用结构体指针。

package mainimport "fmt"type Person struct {Name    stringAge     intAddress string
}func main() {// 创建结构体指针p := &Person{Name:    "Bob",Age:     25,Address: "Home",}fmt.Println(p)  // 输出: &{Bob 25 Home}
}

3. 结构体字段的访问

结构体的字段通过 . 运算符进行访问。可以通过结构体对象(或者结构体指针)访问字段。

访问结构体字段:
package mainimport "fmt"type Person struct {Name    stringAge     intAddress string
}func main() {p := Person{Name: "John", Age: 28, Address: "New York"}// 访问结构体字段fmt.Println("Name:", p.Name)    // 输出: Name: Johnfmt.Println("Age:", p.Age)      // 输出: Age: 28fmt.Println("Address:", p.Address)  // 输出: Address: New York
}
通过指针访问结构体字段:

当存在结构体指针时,通过 -> 运算符访问字段(其实在 Go 中是通过 * 解引用来实现的):

package mainimport "fmt"type Person struct {Name    stringAge     intAddress string
}func main() {p := &Person{Name: "Alice", Age: 30, Address: "Wonderland"}// 通过指针访问结构体字段fmt.Println("Name:", p.Name)    // 输出: Name: Alicefmt.Println("Age:", p.Age)      // 输出: Age: 30fmt.Println("Address:", p.Address)  // 输出: Address: Wonderland
}

4. 修改结构体字段

结构体的字段可以在创建后进行修改:

package mainimport "fmt"type Person struct {Name    stringAge     intAddress string
}func main() {p := Person{Name: "John", Age: 28, Address: "New York"}// 修改结构体字段的值p.Name = "Tom"p.Age = 30p.Address = "California"fmt.Println(p)  // 输出: {Tom 30 California}
}

如果使用的是结构体指针,则可以直接修改字段值。

5. 结构体作为函数参数

结构体可以作为函数的参数进行传递。由于结构体是值类型,传递结构体时会复制整个结构体,这意味着修改副本不会影响原结构体。如果需要修改原结构体,可以传递结构体指针。

传递结构体值:
package mainimport "fmt"type Person struct {Name    stringAge     intAddress string
}func changeName(p Person) {p.Name = "Changed"  // 只是修改了副本,不会改变原结构体
}func main() {p := Person{Name: "John", Age: 28, Address: "New York"}changeName(p)fmt.Println(p)  // 输出: {John 28 New York} 原结构体没有改变
}
传递结构体指针:
package mainimport "fmt"type Person struct {Name    stringAge     intAddress string
}func changeName(p *Person) {p.Name = "Changed"  // 通过指针修改原结构体
}func main() {p := &Person{Name: "John", Age: 28, Address: "New York"}changeName(p)fmt.Println(p)  // 输出: &{Changed 28 New York} 结构体被修改
}

6. 结构体的嵌套

Go 支持结构体嵌套,可以在结构体中嵌套其他结构体。这有助于实现类似“继承”的功能,但它与传统面向对象编程中的继承不同。

示例:结构体嵌套
package mainimport "fmt"type Address struct {Street, City, Country string
}type Person struct {Name    stringAge     intAddress Address  // 嵌套 Address 结构体
}func main() {p := Person{Name: "John",Age:  28,Address: Address{Street: "123 Main St",City:   "New York",Country: "USA",},}fmt.Println(p)  // 输出: {John 28 {123 Main St New York USA}}
}

7. 结构体与方法

在 Go 中,可以为结构体定义方法(即函数),这些方法可以操作结构体的字段。方法是与特定类型(结构体)绑定的。

示例:为结构体定义方法
package mainimport "fmt"type Person struct {Name    stringAge     int
}func (p *Person) Greet() {fmt.Println("Hello, my name is", p.Name)
}func main() {p := &Person{Name: "John", Age: 28}p.Greet()  // 输出: Hello, my name is John
}

在上述例子中,GreetPerson 类型的方法,使用结构体的指针来调用它。


二、控制流

if 语句

if 语句是 Go 语言中的一种条件控制结构,用于判断给定条件是否成立。如果条件为 true,则执行大括号内的代码,否则执行 else 块中的代码。

基本语法

if condition {// 如果 condition 为 true 执行的代码块
} else {// 如果 condition 为 false 执行的代码块
}

例子

package mainimport "fmt"func main() {age := 20if age > 18 {fmt.Println("成年人")  // 如果年龄大于18,输出"成年人"} else {fmt.Println("未成年")  // 如果年龄不大于18,输出"未成年"}
}

if 语句中的 else if

当有多个条件时,可以使用 else if 来进行多条件判断:

if condition1 {// 如果 condition1 为 true 执行的代码块
} else if condition2 {// 如果 condition1 为 false 且 condition2 为 true 执行的代码块
} else {// 如果 condition1 和 condition2 都为 false 执行的代码块
}

例子

package mainimport "fmt"func main() {age := 20if age < 13 {fmt.Println("儿童")} else if age < 18 {fmt.Println("青少年")} else {fmt.Println("成年人")}
}

for 循环

Go 语言的 for 循环有三种常见形式:标准 for 循环、无限循环、以及基于 range 的遍历。

标准 for 循环

这是最常见的循环形式,包含了初始化语句、条件判断语句以及更新语句。

语法:

for initialization; condition; post {// 循环体代码
}

例子

package mainimport "fmt"func main() {for i := 0; i < 5; i++ {fmt.Println(i)  // 输出 0, 1, 2, 3, 4}
}

在此例中,i0 开始,每次循环结束时,i 增加 1,直到 i 不满足 i < 5 这个条件时停止循环。

无限循环

Go 中可以使用 for 语句创建无限循环,语法为 for 后面没有条件判断。

例子

package mainimport "fmt"func main() {for {fmt.Println("无限循环")  // 无限输出 "无限循环"}
}

这个循环会一直执行,除非显式地使用 break 语句或发生其他中断操作(例如程序终止)。

range 遍历

range 关键字是 Go 中一种常用的遍历数组、切片、字符串、映射等数据结构的方式。它返回两个值:一个是索引,另一个是元素值。

语法:

for index, value := range collection {// 对每个元素执行的操作
}

例子

package mainimport "fmt"func main() {arr := []int{10, 20, 30}for index, value := range arr {fmt.Println(index, value)  // 输出数组的索引和对应的值}
}

此例中,indexvalue 分别表示数组中的索引和对应的值,输出会是:

0 10
1 20
2 30

switch 语句

Go 中的 switch 语句是一个多路选择结构,它根据某个表达式的值来选择匹配的 case 语句执行。与传统的 switch 语句不同,Go 的 switch 语句不需要 break 来防止贯穿,每个 case 语句默认是结束的。

基本语法

switch expression {case value1:// 如果 expression == value1,执行此处代码case value2:// 如果 expression == value2,执行此处代码default:// 如果没有匹配到任何 case,执行此处代码
}

例子

package mainimport "fmt"func main() {day := 2switch day {case 1:fmt.Println("星期一")case 2:fmt.Println("星期二")  // 输出 "星期二"case 3:fmt.Println("星期三")default:fmt.Println("无效的星期")}
}

省略 expression

如果没有给出 expression,则 switch 被当作 switch true 处理,这时每个 case 表达式都会被依次判断,直到匹配到 true

例子

package mainimport "fmt"func main() {num := 4switch {case num < 0:fmt.Println("负数")case num == 0:fmt.Println("零")case num > 0 && num < 10:fmt.Println("正数小于10")  // 输出 "正数小于10"default:fmt.Println("其他")}
}

多个 case 合并

多个 case 可以合并为一条代码块,只要它们执行相同的操作。

例子

package mainimport "fmt"func main() {grade := 'B'switch grade {case 'A':fmt.Println("优秀!")case 'B', 'C':  // B 和 C 合并在一起fmt.Println("做得不错!")case 'D':fmt.Println("通过!")case 'F':fmt.Println("下次加油!")default:fmt.Println("无效成绩")}
}

fallthrough 关键字

fallthrough 关键字允许在一个 case 执行后继续执行下一个 case,即使下一个 case 的条件不满足。

例子

package mainimport "fmt"func main() {num := 2switch num {case 1:fmt.Println("1")case 2:fmt.Println("2")fallthrough  // 会进入下一个 casecase 3:fmt.Println("3")default:fmt.Println("无效数字")}
}

输出结果:

2
3

在这个例子中,num2,它会首先输出 2,然后由于 fallthrough,控制流继续进入 case 3 并输出 3

相关文章:

【Go语言快速上手】第一部分:数据类型(数组、切片、映射)与控制语句

文章目录 一、复合类型Ⅰ 数组1. 语法2. 示例3. 特点4. 数组的传递 Ⅱ 切片1. 定义2. 语法3. 示例4. 特点5. 切片的创建6. 切片的操作切片的扩展切片的拷贝 Ⅲ 映射1. 定义2. 语法3. 示例4. 特点5. 映射的创建6. 映射的操作示例&#xff1a;插入、访问和删除判断键是否存在示例…...

系统架构评估中的重要概念

(1)敏感点(Sensitivity Point) 和权衡点 (Tradeoff Point)。敏感点和权衡点是关键的架构 决策。敏感点是一个或多个构件(和/或构件之间的关系)的特性。研究敏感点可使设计人员 或分析员明确在搞清楚如何实现质量目标时应注意什么。权衡点是影响多个质量属性的特性&#xff0c; …...

shell逐行读取文件 远程操作服务器

代码示例 while read ip; doecho "uninstalling test programs in $line" ssh root$ip bash -s < remote_remove_tool.shdone < installed_ips总结 ✅ 作用&#xff1a; 逐行读取 installed_ips 文件中的 IP 地址通过 SSH 连接到远程服务器&#xff…...

盛铂科技SCP4000射频微波功率计与SPP5000系列脉冲峰值 USB功率计 区别

在射频&#xff08;RF&#xff09;和微波测试领域&#xff0c;快速、精准的功率测量是确保通信系统、雷达、卫星设备等高性能运行的核心需求。无论是连续波&#xff08;CW&#xff09;信号的稳定性测试&#xff0c;还是脉冲信号的瞬态功率分析&#xff0c;工程师都需要轻量化、…...

【每日八股】计算机网络篇(三):IP

目录 DNS 查询服务器的基本流程DNS 采用 TCP 还是 UDP&#xff0c;为什么&#xff1f;默认使用 UDP 的原因需要使用 TCP 的场景&#xff1f;总结 DNS 劫持是什么&#xff1f;解决办法&#xff1f;浏览器输入一个 URL 到显示器显示的过程&#xff1f;URL 解析TCP 连接HTTP 请求页…...

vtk 3D坐标标尺应用 3D 刻度尺

2d刻度尺 : vtk 2D 刻度尺 2D 比例尺-CSDN博客 简介&#xff1a; 3D 刻度尺&#xff0c;也是常用功能&#xff0c;功能强大 3D 刻度尺 CubeAxesActor vtkCubeAxes调整坐标轴的刻度、原点和显示效果&#xff0c;包括关闭小标尺、固定坐标轴原点&#xff0c;以及设置FlyMode模…...

探秘基带算法:从原理到5G时代的通信变革【十】基带算法应用与对比

文章目录 三、算法在现代通信系统中的应用3.1 5G 通信中的应用3.1.1 信道编码与调制解调3.1.2 大规模 MIMO 技术3.1.3 案例分析&#xff1a;5G 基站与终端实现 3.2 卫星通信中的应用3.2.1 抗干扰与纠错编码3.2.2 信号处理与调制解调3.2.3 案例分析&#xff1a;卫星通信系统实例…...

消费级、工业级、汽车级、军工级、航天级芯片区别对比

汽车电子行业&#xff0c;经常会由于降本原因&#xff0c;听到“消规、工规、车规”方面的讨论。常见的芯片等级一般是按照使用温度、辐射、抗干扰等来分级。等级分为以下5类: 民用级&#xff08;消费级&#xff09;、工业级、汽车级&#xff08;车规级&#xff09;、军工级、航…...

迷你世界脚本背包接口:Backpack

背包接口&#xff1a;Backpack 彼得兔 更新时间: 2023-10-25 10:29:21 具体函数名及描述如下: 序号 函数名 函数描述 1 getBackpackBarIDRange(...) 获取道具背包栏ID范围(起始ID~结束ID) 2 getBackpackBarSize(...) 获取道具背包栏大小 3 setGridItem(.…...

javaSE基础

java跨平台性&#xff1a; Java 语言编写的程序&#xff0c;一次编译后&#xff0c;可以在多个操作系统上运行。是由于其增加了一个中间件 JVM&#xff0c;JVM 负责将 Java 字节码转换为特定平台的机器码&#xff0c;并执行。 Java 程序从源代码到运行需要经过三步&#xff1a…...

电脑的系统版本是windows7的,下载pycharm的哪个版本比较好呢?

李升伟 整理 在Windows 7系统上选择PyCharm版本时&#xff0c;需综合考虑系统兼容性、Python版本适配性以及开发需求。以下是具体建议和操作指南&#xff1a; 1. 选择PyCharm的兼容版本 推荐版本&#xff1a;PyCharm 2020.3.5及之前的旧版本。 原因&#xff1a;自2021年起&a…...

【前端基础】3、HTML的常用元素(h、p、img、a、iframe、div、span)、不常用元素(strong、i、code、br)

HTML结构 一个HTML包含以下部分&#xff1a; 文档类型声明html元素 head元素body元素 例&#xff08;CSDN&#xff09;&#xff1a; 一、文档类型声明 HTML最一方的文档称为&#xff1a;文档类型声明&#xff0c;用于声明文档类型。即&#xff1a;<!DOCTYPE html>…...

安装mysql

1、安装数据库 下载链接 https://downloads.mysql.com/archives/community/ 下载zip安装包&#xff0c;解压到某个路径下&#xff0c;将bin文件夹添加到系统环境变量 。 然后终端输入指令 mysql --version 验证 2、初始化数据库 打开命令提示符&#xff08;以管理员身份&am…...

关于 QPalette设置按钮背景未显示出来 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/146047054 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

记一次ScopeSentry搭建

介绍 Scope Sentry是一款具有资产测绘、子域名枚举、信息泄露检测、漏洞扫描、目录扫描、子域名接管、爬虫、页面监控功能的工具&#xff0c;通过构建多个节点&#xff0c;自由选择节点运行扫描任务。当出现新漏洞时可以快速排查关注资产是否存在相关组件。 目前功能 插件系…...

【每日学点HarmonyOS Next知识】Web Header更新、状态变量嵌套问题、自定义弹窗、stack圆角、Flex换行问题

【每日学点HarmonyOS Next知识】Web Header更新、状态变量嵌套问题、自定义弹窗、stack圆角、Flex换行问题 1、HarmonyOS 有关webview Header无法更新的问题&#xff1f; 业务A页面 打开 webivew B页面&#xff0c;第一次打开带了header请求&#xff0c;然后退出webview B页面…...

优选算法的智慧之光:滑动窗口专题(二)

专栏&#xff1a;算法的魔法世界​​​​​​ 个人主页&#xff1a;手握风云 目录 一、例题讲解 1.1. 最大连续1的个数 III 1.2. 找到字符串中所有字母异位词 1.3. 串联所有单词的子串 1.4. 最小覆盖子串 一、例题讲解 1.1. 最大连续1的个数 III 题目要求是二进制数组&am…...

Android ChatOn-v1.66.536-598-[构建于ChatGPT和GPT-4o之上]

ChatOn 链接&#xff1a;https://pan.xunlei.com/s/VOKYnq-i3C83CK-HJ1gfLf4gA1?pwdwzwc# 添加了最大无限积分 删除了所有调试信息 语言&#xff1a;全语言支持...

十一、Redis Sentinel(哨兵)—— 高可用架构与配置指南

Redis Sentinel(哨兵)—— 高可用架构与配置指南 在分布式应用中,Redis 主从复制(Master-Slave)虽然能提供读写分离的能力,但它 无法自动故障转移(failover)。如果主节点(Master)发生故障,系统管理员需要手动将某个从节点(Slave)提升为主节点,并重新配置所有从节…...

【STM32】玩转IIC之驱动MPU6050及姿态解算

目录 前言 一.MPU6050模块介绍 1.1MPU6050简介 1.2 MPU6050的引脚定义 1.3MPU6050寄存器解析 二.MPU6050驱动开发 2.1 配置寄存器 2.2对MPU6050寄存器进行读写 2.2.1 写入寄存器 2.2.2读取寄存器 2.3 初始化MPU6050 2.3.1 设置工作模式 2.3.2 配置采样率 2.3.3 启…...

《张一鸣,创业心路与算法思维》

张一鸣&#xff0c;多年如一日的阅读习惯。 爱读人物传记&#xff0c;称教科书式人类知识最浓缩的书&#xff0c;也爱看心理学&#xff0c;创业以及商业管理类的书。 冯仑&#xff0c;王石&#xff0c;联想&#xff0c;杰克韦尔奇&#xff0c;思科。 《乔布斯传》《埃隆马斯…...

深入浅出:UniApp 从入门到精通全指南

https://juejin.cn/post/7440119937644101684 uni-app官网 uniapp安卓离线打包流程_uniapp离线打包-CSDN博客 本文是关于 UniApp 从入门到精通的全指南&#xff0c;涵盖基础入门&#xff08;环境搭建、创建项目、项目结构、编写运行&#xff09;、核心概念与进阶知识&#x…...

低空经济-飞行数据平台 搭建可行方案

搭建一个飞行数据平台是低空经济中至关重要的一环,它能够实现对飞行器的实时监控、数据分析、路径优化以及安全管理。以下是搭建飞行数据平台的详细步骤和技术方案: 一、平台的核心功能 实时监控: 实时获取飞行器的位置、速度、高度、电池状态等数据。提供可视化界面,展示飞…...

【四.RAG技术与应用】【12.阿里云百炼应用(下):RAG的云端优化与扩展】

在上一篇文章中,我们聊了如何通过阿里云百炼平台快速搭建一个RAG(检索增强生成)应用,实现文档智能问答、知识库管理等基础能力。今天咱们继续深入,聚焦两个核心问题:如何通过云端技术优化RAG的效果,以及如何扩展RAG的应用边界。文章会穿插实战案例,手把手带你踩坑避雷。…...

3-7 WPS JS宏 工作表移动复制实例-2(多工作簿的多工作表合并)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

【智能机器人开发全流程:硬件选型、软件架构与ROS实战,打造高效机器人系统】

文章目录 1. 硬件层设计(1) 传感器选型(2) 计算平台 2. 软件架构设计(1) 核心模块划分(2) 通信框架 3. 关键实现步骤(1) 硬件-软件接口开发(2) SLAM与导航实现(3) 仿真与测试 4. 典型框架示例基于ROS的移动机器人分层架构 5. 优化与扩展6. 开源项目参考 1. 硬件层设计 (1) 传感…...

【CSS—前端快速入门】CSS 选择器

CSS 1. CSS介绍 1.1 什么是CSS? CSS(Cascading Style Sheet)&#xff0c;层叠样式表&#xff0c;用于控制页面的样式&#xff1b; CSS 能够对网页中元素位置的排版进行像素级精确控制&#xff0c;实现美化页面的效果&#xff1b;能够做到页面的样式和 结构分离&#xff1b; 1…...

二、QT和驱动模块实现智能家居-----5、通过QT控制LED

在QT界面&#xff0c;我们要实现点击“LED”按钮就可以控制板子上的LED。LED接线图如下&#xff1a; 在Linux 系统里&#xff0c;我们可以使用2种方法去操作上面的LED&#xff1a; ① 使用GPIO SYSFS系统&#xff1a;这需要一定的硬件知识&#xff0c;需要设置引脚的方向、数值…...

在UI设计中使用自定义控件

生成&#xff1a; 自定义控件完成&#xff1a; 看控件的父类是谁&#xff1a; 在想使用的窗口中&#xff1a; 拖动一个与他父类相同类型的控件&#xff1a; 点击控件右键 这样就是你自定义的控件了 运行后&#xff1a; //点击QSpinBox&#xff0c;滑块跟着移动void (QSpinBox::…...

docker 离线安装redis(离线)

docker离线安装redis时&#xff0c;我找了挺多资料都是需要先在另一台能联网的机器上先下载镜像&#xff0c;然后移动内网中的docker服务器进行部署&#xff0c;我也是这么操作的&#xff0c;但是必须拥有能上网的docker环境才能下载&#xff0c;我在github上找到了一种可以直接…...

利用python实现对Excel文件中数据元组的自定义排序

问题引入&#xff1a; 假设你是一个浙江省水果超市的老板&#xff0c;统筹11个下辖地市的水果产量。假设11个地市生产的水果包括&#xff1a;苹果、香蕉和西瓜。你如何快速得到某种水果产量突出&#xff08;排名前几&#xff09;的地市&#xff1f;产量落后&#xff08;排名后…...

基于 Python 深度学习的电影评论情感分析可视化系统(2.0 全新升级)

基于 Python 深度学习的电影评论情感分析可视化系统&#xff0c;基于 Flask 深度学习&#xff0c;构建了一个 影评情感分析系统&#xff0c;能够 自动分析影评、计算情感趋势 并 可视化展示&#xff0c;对于电影行业具有重要参考价值&#xff01; 基于 Python 深度学习的电影评…...

【MYSQL数据库异常处理】执行SQL语句报超时异常

MYSQL执行SQL语句异常&#xff1a;The last packet successfully received from the server was 100,107 milliseconds ago. The last packet sent successfully to the server was 100,101 milliseconds ago. 这个错误表明 MySQL 服务器与 JDBC 连接之间的通信超时了。通常由…...

docker拉取失败

备份原始配置文件 sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak 清理或修复 daemon.json 文件 sudo nano /etc/docker/daemon.json 删除 文件中的所有内容&#xff0c;确保文件为空。 cv下面这个文件内容 { "registry-mirrors": [ &…...

Linux的一些配置(网络建设与运维)

for i in 的指令使用集 传输内容指令 for i in {1..7};do ssh 10.4.220.10${i} "指令";done 传输文件指令 for i in {1..7};do scp 文件 root10.4.220.10${i}:文件位置;done DNS循环内容指令 for i in {1..7};do echo "linux$i A 10.4.220.10$i" >> …...

嵌入式L6计算机网络

Telnet不加密 socket是应用层和下面的内核...

大型语言模型演变之路:从Transformer到DeepSeek-R1

大型语言模型的崛起被认为是人工智能领域的一次革命&#xff0c;从2017年Transformer架构的引入开始&#xff0c;到2025年DeepSeek-R1的推出&#xff0c;每一步都在不断改变着人机交互的方式&#xff0c;推动着学术界与产业界的深度融合。 1. Transformer的引领&#xff08;201…...

Idea配置注释模板

一、配置类注释模板 打开IDEA&#xff0c;打开settings(快捷键&#xff1a;Ctrl Alt s)&#xff0c;选择Editor&#xff0c;找到File and Code Templates 这里以设置class文件为例&#xff0c;点击Class&#xff0c;在右侧配置以下内容 #if (${PACKAGE_NAME} && $…...

通过计费集成和警报监控 Elasticsearch Service 成本

作者&#xff1a;来自 Elastic Alexis Charveriat 使用 Elasticsearch 服务计费集成来跟踪、定制和提醒 Elasticsearch 服务费用。 监控和管理你的Elasticsearch服务&#xff08;ESS&#xff09;使用情况和成本对高效运营至关重要。 Elasticsearch服务计费集成提供了一种简化的…...

50.xilinx fir滤波器系数重加载如何控制

&#xff0c; 注意:matlab量化后的滤波器系数为有符号数&#xff0c;它是以补码形式存储的&#xff0c;手动计算验证时注意转换为负数对应数值进行计算。...

每日一题——接雨水

接雨水问题详解 视频学习推荐 建议先参考以下视频进行学习&#xff1a; 问题描述 给定一个非负整数数组 height&#xff0c;表示每个宽度为 1 的柱子的高度图。计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 示例 1&#xff1a; 输入&#xff1a;height …...

【Flink银行反欺诈系统设计方案】1.短时间内多次大额交易场景的flink与cep的实现

【flink应用系列】1.Flink银行反欺诈系统设计方案 1. 经典案例&#xff1a;短时间内多次大额交易1.1 场景描述1.2 风险判定逻辑 2. 使用Flink实现2.1 实现思路2.2 代码实现2.3 使用Flink流处理 3. 使用Flink CEP实现3.1 实现思路3.2 代码实现 4. 总结 1. 经典案例&#xff1a;短…...

【15】蚂蚁链产品与服务

15-1 蚂蚁链一体机 蚂蚁链一体机概述 蚂蚁链一体机是深度融合软硬件技术、针对区块链技术特色打造的软硬一体化服务器。面对区块链技术落地中的性能、安全和隐私等技术挑战&#xff0c;结合自主硬件技术&#xff0c;打造了高性能、强隐私和高安全的软硬件一体化服务器&#x…...

​DeepSeek:如何通过自然语言生成HTML文件与原型图?

在当今快节奏的开发与设计环境中&#xff0c;快速生成HTML文件或原型图是每个开发者与设计师的迫切需求。虽然DeepSeek无法直接生成图片&#xff0c;但它却能够通过自然语言生成流程图、原型图以及交互式页面&#xff0c;甚至可以直接输出HTML代码。本文将详细介绍如何与DeepSe…...

【JAVA架构师成长之路】【持久层】第2集:SQL常用优化手段

课程标题:SQL常用优化手段——15分钟快速提升数据库性能 目标:掌握10+核心SQL优化技巧,解决慢查询、高负载等生产问题 0-1分钟:优化核心原则——减少数据扫描量 本质逻辑:通过索引、分页、过滤条件等手段,最小化磁盘I/O和内存计算。 反例:SELECT * FROM orders(全表扫…...

文件上传和下载前后端交互逻辑

上传】 1、后端给前端一个上传接口&#xff1a;进行文件上传&#xff0c;上传成功后&#xff0c;该接口返回文件的路径&#xff0c;名称&#xff0c;id 2、表单提交接口&#xff0c;提交表单时&#xff0c;将文件的id和表单信息一块提交给后台&#xff0c;实现文件和表单的绑…...

全向广播扬声器在油气田中的关键应用 全方位守护安全

油气田作为高风险作业场所&#xff0c;安全生产始终是重中之重。在紧急情况下&#xff0c;如何快速、有效地传达信息&#xff0c;确保人员安全撤离&#xff0c;是油气田安全管理的关键环节。全向广播扬声器凭借其全方位覆盖、高音质输出和强大的环境适应性&#xff0c;成为油气…...

PHP之运算符

在你有别的编程语言的基础下&#xff0c;你想学习PHP&#xff0c;可能要了解的一些关于运算符的信息。 三元运算符&#xff0c;短径求值&#xff0c;为空判断 echo 1 ? "b" : "c";//第一个为真时返回第一个&#xff0c;为假时返回第二个 echo 1 ?: &qu…...

hive之lag函数

从博客上发现两个面试题&#xff0c;其中有个用到了lag函数。整理学习 LAG 函数是 Hive 中常用的窗口函数&#xff0c;用于访问同一分区内 前一行&#xff08;或前 N 行&#xff09;的数据。它在分析时间序列数据、计算相邻记录差异等场景中非常有用。 一、语法 LAG(column,…...

3427. 变长子数组求和

给你一个长度为 n 的整数数组 nums 。对于 每个 下标 i&#xff08;0 < i < n&#xff09;&#xff0c;定义对应的子数组 nums[start ... i]&#xff08;start max(0, i - nums[i])&#xff09;。 返回为数组中每个下标定义的子数组中所有元素的总和。 子数组 是数组中…...