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

golang中数组和slice的区别及使用

来自于《go语言中文文档》的学习及自我分析

数组和切片的区别

golang中有两个很相似的数据结构:数组(Array)和slice。数组和slice实际有各自的优缺点和区别,这里列出最主要的区别

功能点数组slice
概念是同一种数据类型的固定长度的序列切片是数组的一个引用,因此切片是引用类型。但自身是结构体,值拷贝传递
数组长度数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变切片的长度可以改变,因此,切片是一个可变的数组
访问数组可以通过下标进行访问切片遍历方式和数组一样,可以用len()求长度。表示可用元素数量,读写操作不能超过该限制
访问越界如果下标在数组合法范围之外,则触发访问越界,会panic访问越界也会panic
值类型or引用赋值和传参会复制整个数组,而不是指针。因此改变副本的值,不会改变本身的值切片可以看做对数组的一个引用
len返回什么数组长度切片长度
cap返回什么数组长度cap可以求出slice最大扩张容量,不能超出数组限制
其他注意事项多维数组只有最外层允许不指定长度使用…来判断

数组:

实际上,对于数组的定义or初始化,已经有很多示例了,例如:

	var arr0 [5]int = [5]int{1, 2, 3} // 正常定义,不足的部分默认为0var arr1 = [5]int{1, 2, 3, 4, 5}var arr2 = [...]int{1, 2, 3, 4, 5, 6} // 根据值的数量得到数组长度var str = [5]string{3: "hello world", 4: "tom"} // 定义某些key上的值,剩余的补默认值,string补""

数组的定义就是这么简单,注意到上文提过数组是值传递,意思是将数组赋值或传参,修改了赋值或传参后的数据,原数组本身不会被改变。给出分别对应的示例:

  1. 赋值给另一个变量,修改另一个变量的值:
func main() {a := [2]int{} // 定义一个长度为2的数组,值为[0, 0]b := ab[1] = 3000fmt.Printf("res A: %v\n", a)   // 打印a,虽然a赋值给b,且b的值有变化,但a不变fmt.Printf("res B: %v\n", b)   // 打印b, b的值已经重新赋值了fmt.Printf("addr A: %p\n", &a) // a的地址fmt.Printf("addr B: %p\n", &b) // b的地址,会发现与a并不相同
}

运行结果为:

res A: [0 0]
res B: [0 3000]
addr A: 0xc000096080
addr B: 0xc000096090
  1. 传参给另一个function,修改值:
func test(x [2]int) {fmt.Printf("x: %p\n", &x)x[1] = 1000
}func main() {a := [2]int{} // 定义一个长度为2的数组,值为[0, 0]test(a)fmt.Printf("res A: %v\n", a) // 打印a,虽然传参给test,但实际上不修改a的值
}

以上代码结果为:

x: 0xc00000a0d0
res A: [0 0]
  1. 想要原数组被改变,使用数组指针
func test(x *[2]int) {fmt.Printf("x: %p\n", &x)x[1] = 1000
}func main() {a := [2]int{} // 定义一个长度为2的数组,值为[0, 0]test(&a)fmt.Printf("res A: %v\n", a) // 打印a,因为test实际传的是a的引用,在test中修改a也会对a本身产生影响
}

以上代码运行结果为:

x: 0xc00005c028
res A: [0 1000]

练习题:

题目描述:第一行输入一个int类型的n,表示将要计算的数组和,接下来的每行输入数组的元素,以空格分隔,当什么都不输入直接回车表示结束。计算每一行的数组中,有哪两个key的和为第一行给出的n,例如数组[1,3,5,8,7],找出两个元
素之和等于8的下标分别是(0,4)和(1,2)

以下是我的代码:

package mainimport ("bufio""fmt""os""strconv""strings"
)func getAddSumNum(sliceArr []int, sum int) (res [][]int) {for i := 0; i < len(sliceArr); i++ {for j := i + 1; j < len(sliceArr); j++ {if sliceArr[i]+sliceArr[j] == sum {res = append(res, []int{i, j})}}}return res
}/*
*
找出数组中和为给定值的两个元素的下标
第一行输入要找到和为n的值
每行输入数组的元素,以空格分隔
输入0代表结束
计算和为n的下标有哪些并输出
*/
func main() {scanner := bufio.NewScanner(os.Stdin)if scanner.Scan() {sum := scanner.Text()for {if scanner.Scan() {input := scanner.Text()inputArr := strings.Split(input, " ")if len(inputArr) == 0 && inputArr[0] == "" {break}var inputIntSlice []intfor _, v := range inputArr {vInt, _ := strconv.Atoi(v)inputIntSlice = append(inputIntSlice, vInt)}sumInt, _ := strconv.Atoi(sum)res := getAddSumNum(inputIntSlice, sumInt)fmt.Printf("origin: %#v, res %#v\n", inputIntSlice, res)}}}
}

slice

slice可以看做数组的引用,但slice 并不是数组或数组指针。它通过内部指针和相关属性引用数组片段,以实现变长方案
创建切片的方式:

	var s1 []int                     // 第一种方式,直接定义slices2 := []int{1, 2}                // 第二种方式,定义slice的值var s3 []int = make([]int, 0)    // 通过makevar s4 []int = make([]int, 0, 0) // 初始化赋值arr := [5]int{1, 2, 3, 4, 5}s5 := arr[2:4] //直接从数组切片,注意是左开右闭fmt.Printf("res:%v\n", s1)fmt.Printf("res:%v\n", s2)fmt.Printf("res:%v\n", s3)fmt.Printf("res:%v\n", s4)fmt.Printf("res:%v\n", s5)

slice[m:n]:切片,从slice[m]一直到slice[n-1]都在这个切片中
slice[:]表示完整的slice
slice[m:n:q],表示从m-n的切片,依然是左开右闭,但是cap为q-m
通过make来创建slice:
make([]int, 0, 0):

	var slice []type = make([]type, len)slice := make([]type, len) // 不传cap则cap=lenslice := make([]type, len, cap)

注意若使用make定义slice的时候传了cap参数,那么定义slice的值的个数不允许超过cap的长度,例如以下代码会报错:

	var sliceTest []int = make([]int, 2, 3)sliceTest[0] = 3fmt.Printf("%d %v\n", 0, sliceTest)sliceTest[1] = 4fmt.Printf("%d %v\n", 1, sliceTest)sliceTest[2] = 5fmt.Printf("%d %v\n", 2, sliceTest)sliceTest[3] = 6fmt.Printf("%d %v\n", 3, sliceTest)sliceTest[4] = 7fmt.Printf("%d %v\n", 4, sliceTest)sliceTest[5] = 8fmt.Printf("%d %v\n", 5, sliceTest)
//执行结果为:
0 [3 0]
1 [3 4]
panic: runtime error: index out of range [2] with length 2// 但是使用append是不会报错的
var sliceTest []int = make([]int, 2, 3)sliceTest[0] = 3fmt.Printf("%d %v\n", 0, sliceTest)sliceTest = append(sliceTest, 4)fmt.Printf("%d %v\n", 1, sliceTest)sliceTest = append(sliceTest, 5)fmt.Printf("%d %v\n", 2, sliceTest)sliceTest = append(sliceTest, 6)fmt.Printf("%d %v\n", 3, sliceTest)sliceTest = append(sliceTest, 7)fmt.Printf("%d %v\n", 4, sliceTest)sliceTest = append(sliceTest, 8)fmt.Printf("%d %v\n", 5, sliceTest)

注意对切片的操作实际上是操作的底层数组,示例:

	arr := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}slice := arr[2:4]slice[0] += 100slice[1] += 100fmt.Printf("slice is: %#v", slice)fmt.Printf("arr is: %#v", arr)
// 结果为:
// slice is: []int{103, 104}arr is: [9]int{1, 2, 103, 104, 5, 6, 7, 8, 9}

即对数组做一个切片,对这个切片的修改会反应到数组上。

超出cap限制时,cap自动扩容:

超出原 slice.cap 限制,就会重新分配底层数组,即便原
数组并未填满。依旧以上文的append为示例:

var sliceTest []int = make([]int, 2, 3)sliceTest[0] = 3fmt.Printf("%d %v, len: %d, cap:%d, \n", 0, sliceTest, len(sliceTest), cap(sliceTest))sliceTest = append(sliceTest, 4)fmt.Printf("%d %v len: %d, cap:%d,\n", 1, sliceTest, len(sliceTest), cap(sliceTest))sliceTest = append(sliceTest, 5)fmt.Printf("%d %v len: %d, cap:%d,\n", 2, sliceTest, len(sliceTest), cap(sliceTest))sliceTest = append(sliceTest, 6)fmt.Printf("%d %v len: %d, cap:%d,\n", 3, sliceTest, len(sliceTest), cap(sliceTest))sliceTest = append(sliceTest, 7)fmt.Printf("%d %v len: %d, cap:%d,\n", 4, sliceTest, len(sliceTest), cap(sliceTest))sliceTest = append(sliceTest, 8)fmt.Printf("%d %v len: %d, cap:%d,\n", 5, sliceTest, len(sliceTest), cap(sliceTest))
// cap会自动扩容,输出结果如下:
0 [3 0], len: 2, cap:3, 
1 [3 0 4] len: 3, cap:3,
2 [3 0 4 5] len: 4, cap:6,
3 [3 0 4 5 6] len: 5, cap:6,
4 [3 0 4 5 6 7] len: 6, cap:6,
5 [3 0 4 5 6 7 8] len: 7, cap:12,

cap每次扩容都是上次cap的2倍

切片的拷贝:copy

func copy(dst, src []T) int
// dst:目标切片,数据将被拷贝到这里
// src:源切片(数据来源)
// 返回值:实际复制的元素个数(取 dst 和 src 长度的较小值)

copy的几个功能/注意事项
(1)copy只会copy dst 和 src 长度的较小值,也就是说如果源切片比目标切片长,那么目标切片不会自动扩容;反之目标切片只有部分值被覆盖,例如:

// 目标切片比源切片短时:
src := []int{1, 2, 3, 4}
dst := make([]int, 2)
n := copy(dst, src) // n=2,dst=[1,2]// 目标切片比源切片长时:dst := []int{1, 2, 3, 4, 5}src := []int{10, 11}copy(dst, src)fmt.Printf("dst res is: %v\n", dst)// dst res is: [10 11 3 4 5]fmt.Printf("src res is: %v\n", src)

(2)copy时源切片和目标切片的类型必须匹配,否则会编译错误
(3)如果目标切片长度不够,需要显式扩容后再复制,例如:

src := []int{1, 2, 3}
dst := make([]int, 2)
// 扩展 dst 长度
dst = append(dst, make([]int, len(src)-len(dst))...)
copy(dst, src) // dst=[1,2,3]

(4)copy是深拷贝,修改拷贝后的切片不影响原切片

slice遍历:

使用for range即可

切片resize(调整大小)

	var a = []int{1, 3, 4, 5}fmt.Printf("slice a : %v , len(a): %v, cap(a) %v: \n", a, len(a), cap(a))b := a[1:2] // b的cap=原始数组长度-起始索引fmt.Printf("slice b : %v , len(b): %v, cap(b) %v:\n", b, len(b), cap(b))c := b[0:3] // b的容量为3,虽然b没有用到后几位,但是可以拿到fmt.Printf("slice c : %v , len(c): %v, cap(c) %v:\n", c, len(c), cap(c))
// 以上代码输出结果为:
/**
slice a : [1 3 4 5] , len(a): 4, cap(a) 4: 
slice b : [3] , len(b): 1, cap(b) 3:
slice c : [3 4 5] , len(c): 3, cap(c) 3:
*/

这里有个注意事项,因为slice b的长度只有1,因此直接读取b[2]会报错:panic: runtime error: index out of range [2] with length 1,但是获取切片不会报错:c := b[0:3]

数组和切片的内存布局

可以看出,数组实际上是存储在连续的内存地址中的,而切片实际上只是指向开始位置的指针+len+cap构成的结构

字符串和切片

string底层就是一个byte的数组,因此,也可以进行切片操作,例如;

	str := "hello world"fmt.Printf("str[0:5] is: %v\n", str[0:5]) // str[0:5] is: hellofmt.Printf("str[6:] is: %v\n", str[6:])   // str[6:] is: world

不能直接修改字符串中的某个字符:

 	s := "hello"// 下面这行代码会报错,因为不能直接修改字符串的某个字符// s[0] = 'H' // 如果要改变,可以重新赋值s = "Hello"fmt.Println(s)// 要改变某个位置的值,可以现改为[]byte()或[]rune()(中文用这个),然后修改sByte := []byte(s)sByte[6] = 'G'sByte = sByte[:8]sByte = append(sByte, '!')s = string(sByte)fmt.Printf("res of sByte's s: %s\n", s) // res of sByte's s: Hello Go!

切片中两个冒号的理解

切片中可能出现1个冒号,两个冒号的情况,分别列举:

	slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}d0 := slice[:]                                                        // 实际就是和原数组大小相等,cap相等的fmt.Printf("d0: %v, len(d0): %d, cap(d0):%d\n", d0, len(d0), cap(d0)) // [0 1 2 3 4 5 6 7 8 9] 10 10d1 := slice[6:]                                                       //从第6个开始,截取到末尾fmt.Printf("d1: %v, len(d1): %d, cap(d1):%d\n", d1, len(d1), cap(d1)) // [6 7 8 9] 4 4d2 := slice[:3]                                                       // 从第0个开始,截取到3-1个fmt.Printf("d2: %v, len(d2): %d, cap(d2):%d\n", d2, len(d2), cap(d2)) // [0 1 2] 3 10d3 := slice[6:8]                                                      // 从第6个截取到第8-1个fmt.Printf("d3: %v, len(d3): %d, cap(d3):%d\n", d3, len(d3), cap(d3)) // [6 7] 2 4d4 := slice[:6:8]                                                     // 从第0个开始,截取到第6-1个,cap为8fmt.Printf("d4: %v, len(d4): %d, cap(d4):%d\n", d4, len(d4), cap(d4)) // [0 1 2 3 4 5] 6 8

常规slice : data[6:8],从第6位到第8位(返回6, 7),长度len为2, 最大可扩充长度cap为4(6-9)
另一种写法: data[:6:8] 每个数字前都有个冒号, slice内容为data从0到第6位,长度len为6,最大扩充项cap设置为8
a[x:y:z] 切片内容 [x:y] 切片长度: y-x 切片容量:z-x;

在书中提到了一个快速将slice转化为逗号分隔的字符串的方法:strings.Replace(strings.Trim(fmt.Sprint(array_or_slice), "[]"), " ", ",", -1),可以分解为:

(1)fmt.Sprint得到字符串,对于数组就是形如[1 2 3]的结果
(2)然后使用strings.Trim去除收尾的字符"[“以及”]"
(3)使用strings.Replace替换空格为逗号,注意最后一个参数-1表示所有都要替换

相关文章:

golang中数组和slice的区别及使用

来自于《go语言中文文档》的学习及自我分析 数组和切片的区别 golang中有两个很相似的数据结构&#xff1a;数组&#xff08;Array&#xff09;和slice。数组和slice实际有各自的优缺点和区别&#xff0c;这里列出最主要的区别 功能点数组slice概念是同一种数据类型的固定长…...

撕碎QT面具(7):container控件被spacer挤扁,无法进行控件添加的处理方案。

调节容器控件最小大小&#xff0c;然后把内部设计好后&#xff0c;对容器使用水平布局或垂直布局。这样容器的控件就不会被挤扁。...

2月19号

寒假每天敲代码的过程中,从先前的什么都不懂,在一步步看题解,学习新知识,运用学到的知识,解决问题,很多时候对数据结构和算法的选择有问题,不能准确选择,这个时候还是得多敲代码,就我自己而言,代码敲多了会让自己更熟练掌握这个知识点,也能更好的去运用,遇到相似的问题还可以举…...

EX_25/2/19

1. 封装一个 File 类&#xff0c;用有私有成员 File* fp 实现以下功能 File f "文件名" 要求打开该文件 f.write(string str) 要求将str数据写入文件中 string str f.read(int size) 从文件中读取最多size个字节&#xff0c;并将读取到的数据返回 析构函数 …...

纯新手教程:用llama.cpp本地部署DeepSeek蒸馏模型

0. 前言 llama.cpp是一个基于纯C/C实现的高性能大语言模型推理引擎&#xff0c;专为优化本地及云端部署而设计。其核心目标在于通过底层硬件加速和量化技术&#xff0c;实现在多样化硬件平台上的高效推理&#xff0c;同时保持低资源占用与易用性。 最近DeepSeek太火了&#x…...

ubuntu源码方式安装TensorRT-LLM推理框架

简要记录安装过程和遇到的问题 写在前面&#xff1a; 一切的二手安装教程都不如官方手册&#xff0c;建议先根据手册进行安装&#xff0c;遇到问题再自行谷歌&#xff1a; TensorRT官方文档 先安装docker TensorRT-LLM 官方推荐使用 Docker 进行构建和运行 ubuntu安装docker…...

集合 数据结构 泛型

文章目录 1.Collection集合1.1数组和集合的区别【理解】1.2集合类体系结构【理解】1.3Collection 集合概述和使用【应用】内部类匿名内部类Lambda表达式 1.4Collection集合的遍历【应用】1.5增强for循环【应用】 2.List集合2.1List集合的概述和特点【记忆】2.2List集合的特有方…...

python脚本文件设置进程优先级(在.py文件中实现)

在 Python 代码中可以直接通过 psutil 模块或 系统调用 来设置进程优先级&#xff0c;无需依赖终端命令。以下是具体方法和示例&#xff1a; 1. 使用 psutil 模块&#xff08;跨平台推荐&#xff09; psutil 是一个跨平台库&#xff0c;支持 Windows、Linux 和 macOS。通过其 …...

Docker 安装 Apache

Docker 安装 Apache 引言 Apache HTTP Server(简称Apache)是一个开源的HTTP服务器软件,广泛应用于各种操作系统和平台。Docker作为一种容器化技术,可以简化Apache的部署过程,使得其能够在任何环境中快速部署。本文将详细介绍如何在Docker容器中安装Apache。 准备工作 …...

​实在智能与宇树科技、云深科技一同获评浙江省“人工智能服务商”、 “数智优品”​等荣誉

近日&#xff0c;浙江省经信厅正式公布《2024 年浙江省人工智能应用场景、应用标杆企业、人工智能服务商及 “数智优品” 名单》。 实在智能获评浙江省“人工智能服务商”&#xff0c;核心产品 “实在 Agent 智能体” 入选 “数智优品”。一同获此殊荣的还有宇树科技、云深处科…...

C语言指针学习笔记

1. 指针的定义 指针&#xff08;Pointer&#xff09;是存储变量地址的变量。在C语言中&#xff0c;指针是一种非常重要的数据类型&#xff0c;通过指针可以直接访问和操作内存。 2. 指针的声明与初始化 2.1 指针声明 指针变量的声明格式为&#xff1a;数据类型 *指针变量名…...

管道的学习

进程间通信&#xff1a;是指在操作系统中&#xff0c;两个或多个独立的进程之间进行数据交换和信息共享的一种机制 进程间通信的本质&#xff1a;先让不同的进程先看到同一份资源&#xff0c;才有通信的条件 进程间通信的目的&#xff1a; 1.将一个进程的数据发送给另一个进程…...

迪威模型网:免费畅享 3D 打印盛宴,科技魅力与趣味创意并存

还在为寻找优质3D打印模型而发愁&#xff1f;快来迪威模型网&#xff08;https://www.3dwhere.com/&#xff09;&#xff0c;一个集前沿科技与无限趣味于一体的免费3D打印宝藏平台&#xff01; 踏入迪威模型网&#xff0c;仿佛开启一场未来科技之旅。其“3D打印”专区&#xff…...

Java运算符

- 算术运算符 - 正号 - - 负号 - 加号 - - 减号 - * 乘号 - / 除 - % 取余 - 自增&#xff08;前&#xff09; 先运算后取值 i&#xff1b; 自增&#xff08;后&#xff09; 先取值后运算 i&#xff1b; public cla…...

Kimi K1.5 与 DeepSeek R1:AI 模型的深度对比

文章目录 一、背景介绍二、核心功能对比三、K1.5 使用方法&#xff1a;四、总结 随着人工智能技术的飞速发展&#xff0c;大型语言模型在各个领域都展现出了巨大的潜力。Kimi K1.5 和 DeepSeek R1 作为当前备受关注的两款先进 AI 模型&#xff0c;各自拥有独特的功能和优势。本…...

mysql索引为什么用B+树不用,B树或者红黑树

MySQL 选择 B 树作为索引结构&#xff0c;而不是 B 树或红黑树&#xff0c;主要原因如下&#xff1a; 1. 磁盘 I/O 优化 B 树&#xff1a;节点存储更多键值&#xff0c;树的高度较低&#xff0c;减少了磁盘 I/O 次数&#xff0c;适合处理大规模数据。 B 树&#xff1a;虽然也…...

Redis 全方位解析:从入门到实战

引言 在当今互联网快速发展的时代&#xff0c;高并发、低延迟的应用场景越来越普遍。Redis&#xff0c;作为一款高性能的开源数据库&#xff0c;以其卓越的性能和灵活的功能&#xff0c;成为了许多开发者的首选工具。无论是在缓存、消息队列&#xff0c;还是在实时数据分析等领…...

无第三方依赖 go 语言工具库

- 开源地址 GitHub - zdhsoft/xmutilsgo: utils for go - 使用办法 go get github.com/zdhsoft/xmutilsgo 主要内容 int.go 定义泛型的整数类型和字符串转整数的函数和随机范围的函数isin.go 判断指定元素是否再数组中的函数page.go mysql用于分页的类ret.go 通用返回值的类…...

代码随想录算法【Day49】

Day49 42. 接雨水 思路 这道题利用单调栈进行横向求解。对于每一个元素&#xff0c;找到它右边第一个比它大的元素和左边第一个比它大&#xff08;或者与它相等的元素&#xff0c;当然这种情况可以忽略&#xff09;&#xff0c;最后计算雨水的存储量&#xff1a;&#xff08…...

R-CNN

这是一个20004096的一个特征矩阵 05:44在这个特征矩阵当中呢 05:45每一行就是我们一个候选框 05:48通过CNN网络得到了一个特征向量 05:51然后它有2000候选框 05:53所以它一共有2000行 05:54然后中间这个就是我们所说的SVM权值矩阵 05:58它的每一列呢 05:59就对应着我们…...

Linux探秘坊-------5.git

1.git介绍 1.版本控制器 为了能够更⽅便我们管理这些不同版本的⽂件&#xff0c;便有了版本控制器。所谓的版本控制器&#xff0c;就是能让你了解到⼀个⽂件的历史&#xff0c;以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&am…...

项目中分库分表的分布式ID如何生成

分库分表与分布式ID生成在Java项目中的应用 在大规模的分布式系统中&#xff0c;数据库表和数据量的增大可能会导致单个数据库或单个表的性能瓶颈。为了解决这个问题&#xff0c;我们通常使用分库分表来进行数据的水平切分和垂直切分。同时&#xff0c;在分布式环境中&#xf…...

SOME/IP--协议英文原文讲解8

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2 Speci…...

JUC并发—7.AQS源码分析三

大纲 1.等待多线程完成的CountDownLatch介绍 2.CountDownLatch.await()方法源码 3.CountDownLatch.coutDown()方法源码 4.CountDownLatch总结 5.控制并发线程数的Semaphore介绍 6.Semaphore的令牌获取过程 7.Semaphore的令牌释放过程 8.同步屏障CyclicBarrier介绍 9.C…...

避坑:过早的文件结束符(EOF):解决“git clone龙蜥OS源码失败”的失败过程

避坑&#xff1a;过早的文件结束符&#xff08;EOF&#xff09;&#xff1a;解决“git clone龙蜥OS源码失败”的失败过程 安装Anolis OS 8.9 下载AnolisOS-8.9-x86_64-dvd.iso并安装。 使用uname -a查看内核版本为5.10.134-18.an8.x86_64。 [rootlocalhost cloud-kernel]# c…...

基于知识图谱的问答系统:后端Python+Flask,数据库Neo4j,前端Vue3(提供源码)

基于知识图谱的问答系统&#xff1a;后端PythonFlask&#xff0c;数据库Neo4j&#xff0c;前端Vue3 引言 随着人工智能技术的不断发展&#xff0c;知识图谱作为一种结构化的知识表示方式&#xff0c;逐渐成为问答系统的重要组成部分。本文将介绍如何构建一个基于知识图谱的问答…...

日做力扣题2--215. 数组中的第K个最大元素

这道题我在做北京的一家教育公司的笔试时出现过&#xff0c;且题目里直接要求使用快排做&#xff0c;所以我也使用快排做的。 题目&#xff1a; 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最…...

centos8 使用yum安装程序出现报错

在执行yum指令出现源更新不了Could not resolve host: mirrorlist.centos.org&#xff1b; Unknown error问题 yum -y update结果 Errors during downloading metadata for repository appstream: - Curl error (6): Couldnt resolve host name for http://mirrorlist.centos…...

linux系统搭建DNS服务器、详细知识讲解

DNS服务器系统为rocky9.5&#xff0c; 1、安装DNS dnf -y install bind bind-utilsbind软件包 BIND 是一个开源的 DNS 服务器软件&#xff0c;广泛用于域名解析服务。 配置管理&#xff1a; 权威 DNS 服务器&#xff08;Authoritative DNS&#xff09;&#xff1a;为特定域名…...

【部署优化篇四】《DeepSeek移动端优化:CoreML/TFLite实战对比》

手机里的AI助手能秒速回答你的问题,游戏人物能实时追踪你的表情变化,这些酷炫功能的背后都离不开移动端机器学习框架的支撑。今天我们就来撕开两个当红炸子鸡框架CoreML和TFLite的神秘面纱,看看它们在模型优化这件事上到底藏着哪些独门绝技。 一、移动端优化的生存法则 在…...

DeepSeek联网搜索

deepseek 0、前言1、未联网2、联网2.1 SerpAPI2.2 SerpAPIDeepseek 0、前言 为获取最新消息&#xff0c;需给deepseek联网 1、未联网 from dotenv import load_dotenv from langchain_deepseek import ChatDeepSeekload_dotenv()# 1、模型 model ChatDeepSeek(model"d…...

pt100 2线和3线的区别?

3线比2线更稳定一些&#xff1b; 在电路中&#xff0c;b和c是不连接在一起的&#xff1b; 测试的时候&#xff0c;b和c是接在一起的&#xff0c;也就是说pt100中b和c是连接在一起的 3线比2线多一个反馈&#xff1b; 平时测试的时候&#xff0c;测试一下ab或者ac 都是一样的…...

ollama-chat-ui-vue,一个可以用vue对接ollama的开源项目,可接入deepSeek

ollama-chat-ui-vue 使用vue3 vite elementUi 搭建的前端chat,通过ollama可与模型对话,目前支持独立思考,切换模型(联网查询后续支持) github地址&#xff1a;ollama-chat-ui-vue 制作不易github点点star&#xff0c;谢谢 前置工作 安装ollama,ollama官网地址 安装完olla…...

hot100-3、438、560、239、240、160、234(2简3中1难)

滑窗问题↓ 3. 无重复字符的最长子串&#xff08;中等&#xff09; 方法一、滑动窗口 数组结合哈希表ascii码&#xff0c;滑动出口。其实可以优化为left Math.max(left,map.get(s.charAt(i)) 1)&#xff0c;数组的话就是全部初始化为-1&#xff0c;用来计算最新下标而不是…...

深入理解 Java 反射机制:获取类信息与动态操作

在 Java 编程中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时动态地获取类的信息并操作类的属性、方法和构造器。反射是 Java 动态语言特性的核心&#xff0c;广泛应用于框架开发、插件系统、序列化和反序列化等领域。本文…...

Redis 主从复制

概念 在分布式系统中为了解决单点问题&#xff0c;通常会把数据复制多个副本部署到其他服务器&#xff0c;满⾜故障恢复和负载均衡等需求。Redis 也是如此&#xff0c;它提供了复制的功能&#xff0c;实现了相同数据的多个 Redis 副本&#xff0c;通过一个主节点&#xff08;ma…...

Unity中NavMesh的使用 及其 导出给java服务端进行寻路

1.先添加 AI Navigation组件 2.Windows-->AI-->Navigation(Obsolete) 这样子就可以看到烘焙按钮 3.将物体标记为行走和不可行走 4.添加一个Plane和一些球体&#xff0c;并把需要形成NavMesh的物体选择为静态 // 因为只能烘焙静态的 之后可以看出烘焙后&#xff0c;看着被…...

【含文档+PPT+源码】基于微信小程序的猎兔汽车保养维修美容服务平台的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的猎兔汽车保养维修美容服务平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部…...

iOS App的启动与优化

App的启动流程 App启动分为冷启动和热启动 冷启动&#xff1a;从0开始启动App热启动&#xff1a;App已经在内存中&#xff0c;但是后台还挂着&#xff0c;再次点击图标启动App。 一般对App启动的优化都是针对冷启动。 App冷启动可分为三个阶段&#xff1a; dyld&#xff1a…...

一周学会Flask3 Python Web开发-request请求钩子(Hook)

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 有时候我们业务需求对请求做一些鉴权&#xff0c;日志&#xff0c;统计分析等功能&#xff0c;这时候可以对请求进行预处理( …...

git clone

方法一&#xff08;替换URL&#xff09; git clone https://gitclone.com/github.com/tendermint/tendermint.git 方法二&#xff08;设置git参数&#xff09; git config --global url."https://gitclone.com/".insteadOf https:// git clone https://github.co…...

nginx ngx_http_module(8) 指令详解

nginx ngx_http_module(8) 指令详解 nginx 模块目录 nginx 全指令目录 一、目录 1.1 模块简介 ngx_http_ssi_module&#xff1a;服务器端包含&#xff08;SSI&#xff09;模块&#xff0c;允许在HTML页面中插入其他内容或动态生成的内容。通过特殊的SSI指令&#xff08;如 …...

Apache Struts RCE (CVE-2024-53677)

前言 对目前的Apache Struts RCE (CVE-2024-53677)的poc进行总结&#xff0c;由于只能单个ip验证&#xff0c;所以自己更改一下代码&#xff0c;实现&#xff1a;多线程读取url验证并保存&#xff0c;更改为中文解释 免责声明 请勿利用文章内的相关技术从事非法测试&#xf…...

windows系统本地部署DeepSeek-R1全流程指南:Ollama+Docker+OpenWebUI

本文将手把手教您使用OllamaDockerOpenWebUI三件套在本地部署DeepSeek-R1大语言模型&#xff0c;实现私有化AI服务搭建。 一、环境准备 1.1 硬件要求 CPU&#xff1a;推荐Intel i7及以上&#xff08;需支持AVX2指令集&#xff09; 内存&#xff1a;最低16GB&#xff0c;推荐…...

前端:最简单封装nmp插件(组件)过程。

一、nmp使用 1、注册nmp账号&#xff1a;npm | Home 2、创建插件名称文件夹&#xff0c;如&#xff1a; vue3-components 3、初始化一个package.json文件&#xff1a;nmp init npm init package.json配置用处介绍&#xff0c;如下&#xff1a; {// 包名&#xff0c;必须…...

百度搜索融合 DeepSeek 满血版,开启智能搜索新篇

百度搜索融合 DeepSeek 满血版&#xff0c;开启智能搜索新篇 &#x1f680; &#x1f539; 一、百度搜索全量接入 DeepSeek &#x1f539; 百度搜索迎来重要升级&#xff0c;DeepSeek 满血版全面上线&#xff01;&#x1f389; 用户在百度 APP 搜索后&#xff0c;点击「AI」即…...

导出指定文件夹下的文件结构 工具模块-Python

python模块代码 import os import json import xml.etree.ElementTree as ET from typing import List, Optional, Dict, Union from pathlib import Path class DirectoryTreeExporter:def __init__(self,root_path: str,output_file: str,fmt: str txt,show_root: boo…...

V4L2驱动之UVC

以下是关于V4L2摄像头驱动框架与UVC协议的关联分析&#xff0c;从内核驱动到用户空间的完整视角&#xff1a; 1. V4L2驱动框架核心架构 关键组件&#xff1a; 核心层 (V4L2 Core) v4l2_device&#xff1a;设备的总入口&#xff0c;管理所有子组件video_device&#xff1a;对应…...

【Linux】匿名管道的应用场景-----管道进程池

目录 一、池化技术 二、简易进程池的实现&#xff1a; Makefile task.h task.cpp Initchannel函数&#xff1a; 创建任务&#xff1a; 控制子进程&#xff1a; 子进程执行任务&#xff1a; 清理收尾&#xff1a; 三、全部代码&#xff1a; 前言&#xff1a; 对于管…...

umi react+antd 判断渲染消息提示、input搜索、多选按钮组

记得map里返回的每层遍历结构都要带上key&#xff08;图里没加&#xff0c;最近在接手react&#xff0c;熟悉中......