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

Go:复合数据结构

数组

  • 定义:数组是固定长度、元素数据类型相同的序列 。元素通过索引访问,索引从 0 到数组长度减 1 。可用len函数获取元素个数 。

  • 初始化:默认元素初始值为类型零值(数字为 0 ) 。可使用数组字面量初始化,如var q [3]int = [3]int{1, 2, 3} ,也可简化为q := [...]int{1, 2, 3} ,省略号使数组长度由初始化元素个数决定 。

  • 类型特性:数组长度是类型一部分,[3]int[4]int是不同类型 ,且长度须是编译时可确定的常量表达式 。

  • 比较规则:若元素类型可比较,数组也可比较,用==判断两边元素值是否完全相同,!=判断是否不同 。不同长度数组不能比较 。

在函数中的传递

  • 函数传参时,传入数组会创建副本,值传递方式使传递大数组低效,且函数内修改不影响原始数组 。可传递数组指针,函数内对指针指向数组的修改会反映到原始数组 ,如zero函数通过指针将[32]byte数组元素清零 。

slice

  • 定义:slice 是拥有相同类型元素的可变长度序列,写法为[]TT为元素类型,可看作底层数组的动态视图 。

  • 底层结构:底层是数组,slice 有指针(指向数组第一个可访问元素 )、长度(可访问元素个数 )和容量(从第一个元素到底层数组最后一个元素间元素个数 )三个属性 ,用lencap函数获取长度和容量 。

  • 与数组关系:一个底层数组可对应多个 slice ,slice 可引用数组任意位置,元素可重叠 。

  • 创建新 slice:用s[i:j]0 ≤ i ≤ j ≤ cap(s) )操作符创建新 slice ,引用原 slice 从ij - 1索引位置元素 ,省略i默认从 0 开始,省略j默认到len(s) - 1

  • 引用越界情况:引用超过容量会导致程序宕机;超过长度会使最终 slice 比原 slice 长 。

与字符串、数组操作对比

  • 字符串子串操作和字节 slice 操作类似,都写作x[m:n] ,但字符串返回字符串,字节 slice 返回字节 slice 。

在函数中的传递

  • 传递 slice 给函数时,因包含指向数组元素指针,函数内可修改底层数组元素 ,如reverse函数可就地反转整型 slice 元素。

  • 比较:slice 不能直接用==比较是否相同,因元素非直接关联 ,可自定义函数深度比较 。标准库bytes.Equal可比较字节 slice 。

  • 特殊值:值为nil的 slice 长度和容量为零,无对应底层数组 ;非nil但长度和容量为零的 slice 有底层数组 。检查 slice 是否为空用len(s) == 0而非s == nil

创建

  • make函数可创建指定元素类型、长度和容量的 slice ,容量参数可省略,此时长度和容量相等

append 函数

  • 基本用法:内置函数append用于将元素追加到 slice 后面 。

  • 原理append操作需检查 slice 容量。若容量足够,在原底层数组基础上扩展 slice 并添加元素;若容量不足,创建新的足够大容量的底层数组,将原 slice 元素复制到新数组,再追加新元素 。

func main() {var x, y []intfor i := 0; i < 10; i++ {y = appendInt(x, i)fmt.Printf("%d cap=%d\t%v\n", i, cap(y), y)x = y}
}func appendInt(x []int, y int) []int {var z []intzlen := len(x) + 1if zlen <= cap(x) {z = x[:zlen]} else {zcap := max(zlen, 2 * len(x))z = make([]int, zlen, zcap)copy(z, x)}z[len(x)] = yreturn z
}
  • 示例appendInt函数模拟append功能 。当 slice 容量足够(zlen <= cap(x) )时,直接在原 slice 扩展;容量不足时,新数组容量一般扩展为原 slice 长度的 2 倍(通过zcap计算 ),用make创建新数组,再用copy函数将原 slice 元素复制到新数组,最后追加新元素并返回新 slice 。

copy 函数

  • copy函数用于将一个 slice 元素复制到另一个 slice ,参数分别为目标 slice 和源 slice ,返回值是实际复制的元素个数(两个 slice 长度的较小值 ) 。

append 函数增长策略

  • 每次append操作若导致 slice 容量改变,意味着底层数组重新分配和元素复制 。以示例程序展示每次追加元素时 slice 容量变化,如容量不够时会成倍扩展 ,以减少内存分配次数 。实际内置append函数增长策略更复杂,无法预先确定一次调用是否引发新内存分配 。

注意事项

  • 使用append后通常需将结果重新赋值给原 slice 变量 ,因为函数可能改变 slice 指针、长度或容量 。
  • 对于任何可能改变 slice 相关属性的函数调用,都要注意更新 slice 变量 。并且appendInt只能添加单个元素,而内置append可同时添加多个元素甚至另一个 slice 的所有元素 。

slice 就地修改

func nonempty(strings []string) []string {i := 0for _, s := range strings {if s != "" {strings[i] = si++}}return stirngs[:i]
}
  • nonempty函数:用于从字符串列表 slice 中去除空字符串 。通过遍历输入的strings slice ,将非空字符串依次复制到原 slice 前面位置,最后返回有效元素部分(strings[:i] ) 。该函数输入和输出的 slice 共用底层数组,避免重新分配数组,也可利用append函数实现类似功能 。

实现栈

  • 可用 slice 实现栈,通过append向 slice 尾部追加元素实现入栈操作(stack = append(stack, v) ) ,栈顶元素为stack[len(stack) - 1] ,通过stack = stack[:len(stack) - 1]实现出栈操作 。

移除操作

  • 保持顺序移除:要从 slice 中间移除元素并保留剩余元素顺序,使用copy函数,将指定位置(i )之后元素向前移动覆盖被移除元素位置,如copy(slice[i:], slice[i + 1:]) ,然后返回处理后的 slice(slice[:len(slice) - 1] ) 。
  • 不保持顺序移除:若无需保持顺序,可将 slice 最后一个元素赋值给被移除元素位置,如slice[i] = slice[len(slice) - 1] ,再返回处理后的 slice(slice[:len(slice) - 1] ) 。

map

  • 定义map是散列表的引用,是拥有键值对元素的无序集合 ,类型为map[K]VK为键类型,V为值类型 。键类型须可通过==操作符比较,值类型无限制 。

创建与初始化

  • make函数创建,如ages := make(map[string]int)
  • 也可用字面量新建带初始化键值对的map ,如ages := map[string]int{"alice": 31, "charlie": 34} ,还可分步赋值 。
  • map表示为map[string]int{}

操作

  • 元素访问:通过下标方式访问,如ages["alice"] ,键不存在时返回值类型零值 。
  • 元素删除:使用delete函数根据键移除元素,如delete(ages, "alice") ,操作安全,键不存在也不会出错 。
  • 元素修改与新增:可通过赋值语句修改或新增元素,如ages["bob"] = ages["bob"] + 1 ,快捷赋值方式(+=++ )同样适用 ,但不能获取map元素地址 。

遍历

  • for循环结合range关键字遍历,如for name, age := range ages { fmt.Printf("%s\t%d\n", name, age) } ,元素迭代顺序不固定 。若要按键顺序遍历,对于字符串键,可借助sort包的Strings函数对键排序后再遍历 。

零值与特殊情况

  • map类型零值是nil ,大部分map操作可在零值map上执行,但向零值map设置元素会导致错误 ,设置元素前需初始化 。
  • 通过下标访问map元素时,可使用多值返回判断元素是否存在 ,如age, ok := ages["bob"]; if!ok { /*...*/ }

比较

  • map不可直接比较,唯一合法比较是和nil比较 。要判断两个map是否相同,需编写循环逐个比较键值对 。
func main() {seen := make(map[string]bool)input := bufio.NewScanner(os.Stdin)for input.Scan() {line := input.Text()if !seen[line] {seen[line] = truefmt.Println(line)}}if err := input.Err(); err != nil {fmt.Fprintf(os.Stderr, "dedup: %v\n", err)os.Exit(1)}
}
  • 去重示例dedup程序利用map存储已出现的行,确保相同行不重复输出 。

结构体

type Employee struct {ID intName stringAddress stringDoB time.TimePosition stringSalary intManagerId int
}
  • 定义:结构体是将多个任意类型的命名变量组合在一起的聚合数据类型 ,每个变量是结构体成员 。以员工信息记录为例,可定义Employee结构体包含IDNameAddress等成员 。
  • 成员访问与操作
    • 通过点号(. )访问结构体成员,如dilbert.Name
    • 可对成员赋值,如dilbert.Salary -= 5000 ;也可获取成员地址,通过指针访问修改,如position := &dilbert.Position; *position = "Senior " + *position
    • 结构体指针同样用点号访问成员,如employeeOfTheMonth.Position += " (proactive team player)"

定义规则

  • 成员变量一般一行写一个,相同类型的连续成员变量可写在一行 。成员变量顺序影响结构体同一性,改变顺序会定义出不同结构体类型 。
  • 首字母大写的成员变量是可导出的,是 Go 语言的访问控制机制 。

限制与应用

type tree struct {value intleft, right *tree
}func Sort(values []int) {var root *treefor _, v := range values {root = add(root, v)}appendValues(values[:0], root)
}func add(t *tree,  value int) *tree {if t == nil {t = new(tree)t.value = valuereturn t}if value < t.value{t.left = add(t.left, value)} else {t.right = add(t.right, value)}return t
}func appendValues(values[]int, t *tree) []int{if t != nil {values = appendValues(values, t.left)values = append(values, t.value)values = appendValues(values, t.right)}return values
}
  • 一个结构体类型不能包含自身类型的成员变量,但可包含自身类型的指针 ,用于创建递归数据结构,如链表、树 。
  • 示例:给出用二叉树实现插入排序,包括Sort函数构建二叉树并排序、appendValues函数按序追加元素、add函数向二叉树插入节点 。

零值

  • 结构体零值由成员零值组成,很多情况下零值是合理可用的初始状态 ,如bytes.Buffersync.Mutex 。还提到空结构体struct{} ,无成员变量,长度为 0 ,可用于一些节省内存且语法简单的场景 ,如在map中作值类型来替代集合 。

结构体字面量

  • 第一种格式:按成员变量顺序为每个成员指定值 ,如Point结构体,p := Point{1, 2} 。此格式要求记住成员顺序,在结构体成员扩充或顺序调整时不利于代码维护,常用于结构体定义所在包或成员顺序有明显约定的小结构体 ,如image.Pointcolor.RGBA

  • 第二种格式:通过指定部分或全部成员变量的名称和值来初始化结构体变量 ,如anim := gif.GIF{LoopCount: nframes} 。未指定值的成员取其类型零值 ,成员顺序无要求 ,使用更广泛 。

  • 两种初始化方式不能混合使用 ,且第一种方式不能绕过不可导出变量的访问限制 。

  • 值传递:结构体类型的值可作为参数传递给函数或作为函数返回值 ,如Scale函数将Point结构体按比率缩放并返回新的Point

  • 指针传递:出于效率和修改结构体内容的需求,大型结构体常以指针形式传递给函数或从函数返回

创建与初始化

  • 可使用&Point{1, 2}直接创建并初始化Point结构体变量并获取其地址 ,这等价于pp := new(Point); *pp = Point{1, 2} ,且&Point{1, 2}可直接用于表达式或函数调用中 。

结构体比较

  • 若结构体的所有成员变量都可比较,那么这个结构体就是可比较的 。可使用==!=操作符对结构体进行比较 。==操作符按顺序比较两个结构体变量的成员变量 ,以Point结构体为例,p := Point{1, 2}q := Point{2, 1}p == qp.X == q.X && p.Y == q.Y等价,结果都为false
type address struct {hostname stringport int
}
hits := make(map[address]int)
hits[address{"golang.org", 443}]++
  • 和其他可比较类型一样,可比较的结构体类型能作为map的键类型 。

结构体嵌套和匿名成员

type Circle struct {X, Y, Radius int
}type Wheel struct {X, Y, Radius, Spokes int
}var w Wheel
w.X = 8
w.Y = 8
w.Radius = 5
w.Spokes = 20
type Circle struct {Center PointRadius int
}type Wheel struct {Circle  circleSpokes  int
}//  var w Wheel
// w.Circle.Center.X = 8
// w.Circle.Center.Y = 8
// w.Circle.Radius = 5
// w.Spokes = 20// 等价于上面
var w Wheel
w.X = 8
w.Y = 8
w.Radius = 5
w.Spokes = 20

以 2D 绘图程序中形状库为例,最初定义CircleWheel结构体 ,Wheel包含Circle所有属性及额外的Spokes属性 。随着形状增多,重构提取出Point结构体,将Circle定义为包含Center PointRadiusWheel包含CircleSpokes ,但此时访问Wheel成员变得繁琐 。

Go 语言允许定义不带名称的结构体成员(匿名成员 ),其类型须是命名类型或指向命名类型的指针 。如Circle结构体中嵌入PointWheel结构体中嵌入Circle 。使用匿名成员后,可直接通过外层结构体访问内层成员 ,如w.X等价于w.Circle.Point.X

结构体字面量初始化

w = Wheel{Circle{point{8, 8}, 5}, 20}
// or
w = Wheel{Circle: Circle{Point: Point(X: 8, Y: 8),Radius = 5,}Spokes: 20, // 尾部的逗号是必需的
}
  • 结构体字面量不能直接以简洁方式初始化嵌套结构体 ,需遵循形状类型定义 。给出两种合法初始化Wheel结构体的方式 ,一种是w = Wheel{Circle{Point{8, 8}, 5}, 20} ,另一种是详细展开的方式 。

注意事项

  • 一个结构体中不能定义两个相同类型的匿名成员,会引起冲突 。
  • 匿名成员的可导出性由其类型决定 ,即使外层结构体不可导出,仍可通过快捷方式访问可导出匿名成员的内部变量 ,但在声明该匿名成员的包外,显式指定不可导出匿名成员的方式不被允许 。
  • 匿名成员不仅可以是结构体类型,任何命名类型或指向命名类型的指针都可以 ,这种机制是将简单类型组合成复杂复合类型的重要方式,是 Go 语言面向对象编程方式的核心 。

JSON

  • JSON 是一种用于发送和接收格式化信息的标准,是 JavaScript 值的 Unicode 编码,能表示字符串、数字、布尔值、数组和对象等 。它是基本数据类型和复合数据类型的高效、可读性强的表示方法 。JSON 的数组是元素序列,用逗号分隔、方括号括起;对象是键值对映射,键为字符串,用逗号分隔、花括号括起 。

Go 对 JSON 的支持

Go 通过标准库encoding/json等对 JSON 等格式提供编码和解码支持 。

  • 编码(Marshal ):将 Go 数据结构(如结构体、数组、slice、map 等 )转换为 JSON 格式称为marshal ,由json.Marshal函数实现 。如将movies[]Movie类型 )转换为 JSON ,json.Marshal生成字节 slice ,包含无多余空白字符的字符串 。json.MarshalIndent可输出整齐格式化的结果,通过设置前缀和缩进字符串实现 。结构体成员名作为 JSON 对象字段名(通过反射 ),可通过成员标签(field tag )指定对应 JSON 字段名及其他选项,如omitempty表示成员值为零值或空时不输出到 JSON 。
  • 解码(Unmarshal ):将 JSON 字符串解码为 Go 数据结构的过程叫unmarshal ,由json.Unmarshal实现 。合理定义 Go 数据结构,可选择将部分 JSON 数据解码到结构体对象,也可丢弃部分数据 。
// github.go
package githubimport ("encoding/json""fmt""net/http""net/url""strings"
)const IssueURL = "https://api.github.com/repos/%s/issues/%d"type IssuesSearchResult struct {TotalCount int `json:"total_count"`Items      []*Issue
}type Issue struct {Number    intHTMLURL   string `json:"html_url"`Title     stringState     stringUser      *UserCreatedAt string `json:"created_at"`Body      string
}type User struct {Login   stringHTMLURL string `json:"html_url"`
}func SearchIssues(terms []string) (*IssuesSearchResult, error) {q := url.QueryEscape(strings.Join(terms, " "))resp, err := http.Get(IssueURL + "?q=" + q)if err != nil {return nil, err}if resp.StatusCode != http.StatusOK {resp.Body.Close()return nil, fmt.Errorf("search query failed: %s", resp.Status)}var result IssuesSearchResultif err := json.NewDecoder(resp.Body).Decode(&result); err != nil {resp.Body.Close()return nil, err}resp.Body.Close()return &result, nil
}
// issues.go
package mainimport ("fmt""log""os""gopl.io/ch4/github"
)func main() {result, err := github.SearchIssues(os.Args)if err != nil {log.Fatal(err)}fmt.Printf("%d issues:\n", result.TotalCount)for _, item := range result.Items {fmt.Printf("#%-5d %9.9s %.55s\n", item.Number, item.User.Login, item.Title)}
}

image.png

  • 示例:以查询 GitHub 提供的 issue 跟踪接口为例,定义相关结构体(如IssuesSearchResultIssue等 ) ,通过SearchIssues函数发送 HTTP 请求获取 JSON 信息,并将其解析为 Go 结构体 。还可使用json.Decoder流解码方式依次从字节流解码多个 JSON 实体 ,并将结果格式化输出。

文本和HTML 模板

文本模板

  • 模板基础:当格式化需求复杂且需格式与代码分离时,可使用text/template包 。模板中用{{...}}包裹表达式 ,能实现输出值、选择结构体成员、调用函数方法、描述控制逻辑(如if - elserange循环 )等功能 。
  • 示例:以 GitHub 问题列表展示为例,通过模板输出符合条件的 issue 数量及每个 issue 的序号、用户、标题、创建时长等信息 。模板操作中,点号(. )表示当前值,{{.TotalCount}}输出总数,{{range .Items}}{{end}}创建循环 ,符号|用于操作间传递结果 ,如{{.Title | printf "%.64s"}}
  • 模板使用:使用模板需先解析再执行 。通过template.New创建模板,Funcs添加自定义函数(如daysAgo ) ,Parse解析模板 ,template.Must处理解析错误 ,最后Execute执行模板并输出结果 。

HTML 模板

  • 安全特性html/template包功能类似text/template ,但能自动转义 HTML、JavaScript、CSS 和 URL 中的字符串 ,避免注入攻击等安全问题 。
  • 示例展示:将 GitHub 问题列表以 HTML 表格形式输出 ,定义模板并解析执行 ,生成的 HTML 在浏览器中展示 。对比展示text/templatehtml/template对特殊字符处理的差异 ,html/template能正确转义 HTML 元字符 ,防止结构改变和安全风险 。
    printf “%.64s”}}` 。
  • 模板使用:使用模板需先解析再执行 。通过template.New创建模板,Funcs添加自定义函数(如daysAgo ) ,Parse解析模板 ,template.Must处理解析错误 ,最后Execute执行模板并输出结果 。

HTML 模板

  • 安全特性html/template包功能类似text/template ,但能自动转义 HTML、JavaScript、CSS 和 URL 中的字符串 ,避免注入攻击等安全问题 。
  • 示例展示:将 GitHub 问题列表以 HTML 表格形式输出 ,定义模板并解析执行 ,生成的 HTML 在浏览器中展示 。对比展示text/templatehtml/template对特殊字符处理的差异 ,html/template能正确转义 HTML 元字符 ,防止结构改变和安全风险 。

参考资料:《Go程序设计语言》

相关文章:

Go:复合数据结构

数组 定义&#xff1a;数组是固定长度、元素数据类型相同的序列 。元素通过索引访问&#xff0c;索引从 0 到数组长度减 1 。可用len函数获取元素个数 。 初始化&#xff1a;默认元素初始值为类型零值&#xff08;数字为 0 &#xff09; 。可使用数组字面量初始化&#xff0c;…...

SQL 语句基础(增删改查)

文章目录 一、SQL 基础概念1. SQL 简介2. 数据库系统的层次结构 二、SQL 语句分类1. DDL&#xff08;Data Definition Language 数据定义语言&#xff09;1.1 CREATE1.1.1 创建数据库1.1.2 创建数据表1.1.3 创建用户 1.2 ALTER1.2.1 AlTER 添加字段名1.2.2 ALTER 修改字段名1.2…...

【蓝桥杯 CA 好串的数目】题解

题目链接 考虑令 p r e [ i ] pre[i] pre[i] 表示 [ p r e [ i ] , i ] [pre[i], i] [pre[i],i] 是连续非递减子串&#xff0c;这可以类似双指针 O ( n ) O(n) O(n) 预处理&#xff1a; std::vector<int> pre(n); for (int r 1, l 0; r < n; r) {if (s[r] ! s[…...

Oracle for Linux安装和配置(11)——Linux命令

11.1. Linux命令 Linux是目前比较常用和流行的操作系统,现在很多生产环境就会用到它。随着其功能、性能、稳定性和可靠性等方面的日渐增强和完善,加之其成本上的优势,其市场占有率逐日攀升,也得到越来越多广大用户的关注和青睐。但作为一种操作系统,其安装、配置、管理和…...

Linux基础7

一、逻辑卷管理 查看所有物理卷&#xff1a;pvs 查看当前系统卷组&#xff1a;vgs 查看所有逻辑卷&#xff1a;lvs 新创建系统卷组&#xff1a;vgcreate [参数] ​ [volume name] url/sdb[1-2] ​ eg&#xff1a;vgcreate vg_Test /dev/sdb{1,2} >…...

C#打开文件及目录脚本

如果每天开始工作前都要做一些准备工作&#xff0c;比如打开文件或文件夹&#xff0c;我们可以使用代码一键完成。 using System.Diagnostics; using System.IO;namespace OpenFile {internal class Program{static void Main(string[] args){Console.WriteLine("Hello, …...

Docker 镜像 的常用命令介绍

拉取镜像 $ docker pull imageName[:tag][:tag] tag 不写时&#xff0c;拉取的 是 latest 的镜像查看镜像 查看所有本地镜像 docker images or docker images -a查看完整的镜像的数字签名 docker images --digests查看完整的镜像ID docker images --no-trunc只查看所有的…...

Python数组学习之旅:数据结构的奇妙冒险

Python数组学习之旅:数据结构的奇妙冒险 第一天:初识数组的惊喜 阳光透过窗帘缝隙洒进李明的房间,照亮了他桌上摊开的笔记本和笔记本电脑。作为一名刚刚转行的金融分析师,李明已经坚持学习Python编程一个月了。他的眼睛因为昨晚熬夜编程而微微发红,但脸上却挂着期待的微…...

Vue 3 和 Vue 2 的区别及优点

Vue.js 是一个流行的 JavaScript 框架&#xff0c;广泛用于构建用户界面和单页应用。自 Vue 3 发布以来&#xff0c;很多开发者开始探索 Vue 3 相较于 Vue 2 的新特性和优势。Vue 3 引入了许多改进&#xff0c;优化了性能、增强了功能、提升了开发体验。本文将详细介绍 Vue 2 和…...

特殊定制版,太给力了!

今天给大家分享一款超棒的免费录屏软件&#xff0c;真的是录屏的好帮手&#xff01; 这款软件功能可以录制 MP4、AVI、WMV 格式的标清、高清、原画视频&#xff0c;满足你各种需求。 云豹录屏大师 多功能录屏神器 它的界面特别简洁&#xff0c;上手超快&#xff0c;用起来很顺…...

Vue事件修饰符课堂练习

Vue事件修饰符课堂练习 题目‌&#xff1a;基于 Vue 2.0&#xff0c;使用事件修饰符 .stop、.prevent、.capture、.self 和 .once&#xff0c;为按钮绑定 click 事件&#xff0c;并展示每个修饰符的作用。 要求‌&#xff1a; 创建一个 Vue 实例&#xff0c;并绑定到一个 HT…...

Y1——ST表

知识点 ST表 只能询问&#xff0c;不能修改 ST表的预处理&#xff1a; 使用了DP的思想&#xff0c;设a是要求区间最值的数列&#xff0c;f(i,j)表示从第i个数起连续2^j个数中的最大值 状态转移方程 f [ i , j ]max( f [ i , j-1 ], f [ i 2 ^ j-1,j - 1]) 建立ST表 vo…...

Python Cookbook-5.14 给字典类型增加排名功能

任务 你需要用字典存储一些键和“分数”的映射关系。你经常需要以自然顺序(即以分数的升序)访问键和分数值&#xff0c;并能够根据那个顺序检查一个键的排名。对这个问题&#xff0c;用dict 似乎不太合适。 解决方案 我们可以使用 dict 的子类&#xff0c;根据需要增加或者重…...

第二十二: go与k8s、docker相关编写dockerfile

实战演示k8s部署go服务&#xff0c;实现滚动更新、重新创建、蓝绿部署、金丝雀发布-CSDN博客 go 编写k8s命令&#xff1a; 怎么在go语言中编写k8s命令 • Worktile社区 k8s中如何使用go 在K8s编程中如何使用Go-阿里云开发者社区 go build - o : -o&#xff1a;指定输出文件…...

Servlet、HTTP与Spring Boot Web全面解析与整合指南

目录 第一部分&#xff1a;HTTP协议与Servlet基础 1. HTTP协议核心知识 2. Servlet核心机制 第二部分&#xff1a;Spring Boot Web深度整合 1. Spring Boot Web架构 2. 创建Spring Boot Web应用 3. 控制器开发实践 4. 请求与响应处理 第三部分&#xff1a;高级特性与最…...

事件过滤器

1.简介 事件过滤器是指在程序分发到event事件之前进行的一次高级拦截。 2.使用步骤 给控件安装事件过滤器重写eventfilter事件 3.具体实现 3.1安装事件过滤器 代码&#xff1a; //给label1安装事件过滤器ui->label->installEventFilter(this); 3.2重写eventfilter…...

AI识别与雾炮联动:工地尘雾治理新途径

利用视觉分析的AI识别用于设备联动雾炮方案 背景 在建筑工地场景中&#xff0c;人工操作、机械作业以及环境因素常常导致局部出现大量尘雾。传统监管方式存在诸多弊端&#xff0c;如效率低、资源分散、监控功能单一、人力效率低等&#xff0c;难以完美适配现代工程需求。例如…...

Kubernetes nodeName Manual Scheduling practice (K8S节点名称绑定以及手工调度)

Manual Scheduling 在 Kubernetes 中&#xff0c;手动调度框架允许您将 Pod 分配到特定节点&#xff0c;而无需依赖默认调度器。这对于测试、调试或处理特定工作负载非常有用。您可以通过在 Pod 的规范中设置 nodeName 字段来实现手动调度。以下是一个示例&#xff1a; apiVe…...

Nacos注册中心

Nacos注册中心 本地环境搭建 准备挂载的文件夹 在拉取 Nacos 镜像之前&#xff0c;在 E:\docker 文件夹下&#xff0c;创建一个 /nacos 文件夹&#xff0c;等会运行容器时&#xff0c;用于将 Nacos 容器中的配置文件、持久化文件挂载出来&#xff0c;防止容器重启时数据丢失…...

除了 `task_type=“SEQ_CLS“`(序列分类),还有CAUSAL_LM,QUESTION_ANS

task_type="SEQ_CLS"是什么意思:QUESTION_ANS 我是qwen,不同模型是不一样的 SEQ_CLS, SEQ_2_SEQ_LM, CAUSAL_LM, TOKEN_CLS, QUESTION_ANS, FEATURE_EXTRACTION. task_type="SEQ_CLS" 通常用于自然语言处理(NLP)任务中,SEQ_CLS 是 Sequence Classif…...

二战蓝桥杯所感

&#x1f334; 前言 今天是2025年4月12日&#xff0c;第十六届蓝桥杯结束&#xff0c;作为二战的老手&#xff0c;心中还是颇有不甘的。一方面&#xff0c;今年的题目比去年简单很多&#xff0c;另一方面我感觉并没有把能拿的分都拿到手&#xff0c;这是我觉得最遗憾的地方。不…...

深度解析自动化工作流工具:n8n 与 Dify 的对比分析

深度解析自动化工作流工具&#xff1a;n8n 与 Dify 的对比分析 随着企业数字化转型的加速&#xff0c;自动化工具在提高工作效率、降低人工成本方面扮演着越来越重要的角色。市面上有多种自动化工作流工具可供选择&#xff0c;其中 n8n 和 Dify 是两个备受关注的开源和商业产品…...

深度剖析Python中的生成器:高效迭代的秘密武器

深度剖析Python中的生成器&#xff1a;高效迭代的秘密武器 在Python的编程世界里&#xff0c;生成器&#xff08;Generator&#xff09;是一个强大而又迷人的特性&#xff0c;它为开发者提供了一种高效处理大量数据的方式&#xff0c;尤其在涉及到迭代操作时&#xff0c;能显著…...

Mac 下载 PicGo 的踩坑指南

Mac 下载 PicGo 的踩坑指南 一、安装问题 下载地址&#xff1a;https://github.com/Molunerfinn/PicGo/releases 下载之后直接安装即可&#xff0c;此时打开会报错&#xff1a;Picgo.app 文件已损坏&#xff0c;您应该将它移到废纸篓。 这是因为 macOS 为了保护用户不受恶意…...

网页布局汇总

1. 盒模型 容器大小 内容大小 内边距(padding) 边框大小 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…...

基于 Maven 构建的 Thingsboard 3.8.1 项目结构

一、生命周期&#xff08;Lifecycle&#xff09; Maven 的生命周期定义了项目构建和部署的各个阶段&#xff0c;图中列出了标准的生命周期阶段&#xff1a; clean&#xff1a;清理项目&#xff0c;删除之前构建生成的临时文件和输出文件。validate&#xff1a;验证项目配置是否…...

MySQL 中为产品添加灵活的自定义属性(如 color/size)

方案 1&#xff1a;EAV 模型&#xff08;最灵活但较复杂&#xff09; 适合需要无限扩展自定义属性的场景 -- 产品表 CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),price DECIMAL(10,2) );-- 属性名表 CREATE TABLE attributes (id INT PRIMA…...

C++语言程序设计——02 变量与数据类型

目录 一、变量与数据类型&#xff08;一&#xff09;变量的数据类型&#xff08;二&#xff09;变量命名规则&#xff08;三&#xff09;定义变量&#xff08;四&#xff09;变量赋值&#xff08;五&#xff09;查看数据类型 二、ASCII码三、进制表示与转换&#xff08;一&…...

第三篇:Python数据结构深度解析与工程实践

第一章&#xff1a;列表与字典 1.1 列表的工程级应用 1.1.1 动态数组实现机制 Python列表底层采用动态数组结构&#xff0c;初始分配8个元素空间&#xff0c;当空间不足时按0,4,8,16,25,35...的公式扩容&#xff0c;每次扩容增加约12.5%的容量 通过sys模块可验证扩容过程&a…...

dcsdsds

我将为您在页面顶部添加欢迎内容&#xff0c;同时保持整体风格的一致性。以下是修改后的代码&#xff0c;主要修改了模板部分和对应的样式&#xff1a; vue 复制 <template><div class"main-wrapper"><!-- 新增欢迎部分 --><div class"…...

Vitis: 使用自定义IP时 Makefile错误 导致编译报错

参考文章: 【小梅哥FPGA】 Vitis开发中自定义IP的Makefile路径问题解决方案 Vitis IDE自定义IP Makefile错误&#xff08;arm-xilinx-eabi-gcc.exe: error: *.c: Invalid argument&#xff09;解决方法 Vitis 使用自定义IP时: Makefile 文件里的语句是需要修改的&#xff0c;…...

应急响应练习靶机-web1

1&#xff09;背景 小李在值守的过程中&#xff0c;发现有CPU占用飙升&#xff0c;出于胆子小&#xff0c;就立刻将服务器关机&#xff0c;这是他的服务器系统&#xff0c;请你找出以下内容&#xff0c;并作为通关条件&#xff1a; 1.攻击者的shell密码 2.攻击者的IP地址 3.攻击…...

cdp-(Chrome DevTools Protocol) browserscan检测原理逆向分析

https://www.browserscan.net/zh/bot-detection 首先,打开devtools后访问网址,检测结果网页显示红色Robot,标签插入位置,确定断点位置可以hook该方法,也可以使用插件等方式找到这个位置,本篇不讨论. Robot标签是通过insertBefore插入的. 再往上追栈可以发现一个32长度数组,里面…...

MCU刷写——Hex文件格式详解及Python代码

工作之余来写写关于MCU的Bootloader刷写的相关知识,以免忘记。今天就来聊聊Hex这种文件的格式,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢…...

SpringBoot(一)

快速入门 1.概念 SpringBoot 简单、快速地创建一个独立的、生产级别的 Spring 应用&#xff08;说明SpringBoot底层是Spring&#xff09; 大多数 SpringBoot 应用只需要编写少量配置即可快速整合 Spring 平台以及第三方技术 特性&#xff1a; 快速创建独立 Spring 应用 SSM&…...

学习Mysql对库和表的操作以及对数据的操作

对库操作 SHOW DATABASES;可以查看数据库服务器中有哪些数据库(注意databases最后的s不要忘记) SELECT DATABASE();可以查看到目前是在哪个数据库下。 CREATE DATABASE 库名;可以创建一个数据库 DROP DATABASE 库名;可以删除一个数据库 USE 库名;切换到当前数据库 对表操…...

微软office填表无法打勾✔,解决办法!

最近在使用office 填表的时候&#xff0c;碰到需要在选择框中打勾的情况&#xff0c;但是找了半天发现找不到打勾的按钮。为此&#xff0c;记录该问题解决办法&#xff1a; 以这个界面为例&#xff0c;如果点击打勾发现无法✔。 这里因为office和wps的编写不一样&#xff0c;所…...

Python实现链接KS3,并批量下载KS3文件数据到本地

前言 本文是该专栏的第56篇,后面会持续分享python的各种干货知识,值得关注。 在本专栏的上篇文章《Python实现链接KS3,并将文件数据批量上传到KS3》中,笔者有详细介绍基于Python,实现链接KS3并将文件数据批量上传。而本文,笔者将基于在上一篇文章的基础之上,实现链接KS…...

构建智能期货交易策略分析应用:MCP与AI的无缝集成

引言 随着金融科技的快速发展&#xff0c;数据驱动的交易决策已成为期货交易领域的重要趋势。本文将深入探讨一个结合了Model Content Protocol (MCP)和AI技术的期货交易策略分析应用——Futures MCP。该应用不仅提供了丰富的技术分析工具&#xff0c;还通过MCP协议与大型语言…...

区块链点燃游戏行业新未来——技术变革与实践指南

区块链点燃游戏行业新未来——技术变革与实践指南 在数字时代&#xff0c;游戏行业无疑是创新的热土。从简单像素风的街机游戏到沉浸式的虚拟现实&#xff0c;我们见证了技术如何一步步塑造游戏的样貌。然而&#xff0c;在传统游戏模式中&#xff0c;玩家权益往往无法得到保障…...

Jmeter中如何实现关联?

在JMeter中实现关联(Correlation)是性能测试中处理动态数据(如Session ID、Token、动态参数等)的核心技能。以下是详细操作指南,涵盖原理、工具和实战示例: 一、关联的本质与场景 作用:从服务器响应中提取动态数据,供后续请求复用(如登录Token、订单ID、验证码等)。 …...

在MATLAB中使用MPI进行并行编程

在MATLAB中使用MPI进行并行编程 MATLAB支持通过MPI (Message Passing Interface) 进行并行编程&#xff0c;这通常通过Parallel Computing Toolbox和MATLAB Parallel Server实现。以下是使用MPI进行并行编程的基本方法&#xff1a; 基本设置 确保安装了必要的工具箱&#xff…...

15.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--如何拆分单体

单体应用&#xff08;Monolithic Application&#xff09;是指将所有功能模块集中在一个代码库中构建的应用程序。它通常是一个完整的、不可分割的整体&#xff0c;所有模块共享相同的运行环境和数据库。这种架构开发初期较为简单&#xff0c;部署也较为方便&#xff0c;但随着…...

C++: char类型既不是signed char也不是unsigned char

对于 int, short, long, long long 类型&#xff0c; 增加 signed&#xff0c; 类型不变。 对于 char 类型&#xff0c; 增加 signed&#xff0c; 类型变了。 char 既不是 signed char&#xff0c; 也不是 unsigned char。 虽然 char 的取值范围&#xff0c; 一定是&#xff1…...

测试第二课-------测试分类

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

16.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--微服务的部署与运维

部署与运维是微服务架构成功实施的关键环节。一个良好的部署与运维体系能够保障微服务的高可用性、可扩展性和可靠性。在这一阶段&#xff0c;重点包括微服务的容器化与编排、API 网关的实现以及日志与监控体系的建设。 一、容器化与编排 1.1 使用 Docker 容器化微服务 容器…...

什么是供应链金融

供应链金融&#xff08;Supply Chain Finance&#xff09; 是一种基于供应链上下游真实交易场景的金融服务模式&#xff0c;通过整合物流、信息流、资金流和数据流&#xff0c;为核心企业及其上下游中小企业提供灵活、高效的融资解决方案。其核心目标是优化供应链资金周转效率&…...

个人博客系统后端 - 注册登录功能实现指南

一、功能概述 个人博客系统的注册登录功能包括&#xff1a; 用户注册&#xff1a;新用户可以通过提供用户名、密码、邮箱等信息创建账号用户登录&#xff1a;已注册用户可以通过用户名和密码进行身份验证&#xff0c;获取JWT令牌身份验证&#xff1a;使用JWT令牌访问需要认证…...

微信小程序运行机制详解

微信小程序运行机制详解 微信小程序是介于 Web 和原生 App 之间的一种应用形态&#xff0c;具有无需安装、用完即走、体验流畅的特点。本文将从架构层面、运行环境、通信机制等方面深入剖析微信小程序的运行机制。 一、小程序运行架构概览 微信小程序采用双线程模型&#xff…...

GGML源码逐行调试(中)

目录 前言1. 简述2. 加载模型超参数3. 加载词汇表4. 初始化计算上下文5. 初始化计算后端6. 创建模型张量7. 分配缓冲区8. 加载模型权重结语下载链接参考 前言 学习 UP 主 比飞鸟贵重的多_HKL 的 GGML源码逐行调试 视频&#xff0c;记录下个人学习笔记&#xff0c;仅供自己参考&…...