100天精通Golang(基础入门篇)——第17天:深入解析Go语言中的指针
🌷 博主 libin9iOak带您 Go to Golang Language.✨
🦄 个人主页——libin9iOak的博客🎐
🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐
🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐥
100天精通Golang(基础入门篇)
- 100天精通Golang(基础入门篇)——第17天:深入解析Go语言中的指针
- 摘要:
- 引言:
- 前言:
- 一、指针
- 1.1 指针的概念
- 1.2 获取变量的地址
- 1.3 声明指针
- 1.4 空指针
- 1.5 获取指针的值
- 1.6 操作指针改变变量的数值
- 1.7 使用指针传递函数的参数
- 1.8 指针的指针
- 演示代码案例1:
- 运行截图:
- 运行结果:
- 演示代码案例2:
- 运行截图:
- 运行结果:
- 演示代码案例3:
- 运行截图:
- 运行结果:
- 演示代码案例4:
- 运行截图:
- 运行结果:
- 今日学习总结:
- 参考文献:
- 结语
100天精通Golang(基础入门篇)——第17天:深入解析Go语言中的指针
摘要:
本篇文章主要深入解析Go语言中的指针,从指针的概念、获取变量地址,声明指针,空指针,获取指针的值,操作指针改变变量的数值,使用指针传递函数的参数,以及指针的指针等方面进行讲解和示例演示。
引言:
指针是Go语言中一种重要的概念,它提供了直接访问内存地址的能力,使得我们可以更灵活地操作数据和进行内存管理。在本篇文章中,我们将深入探讨指针的各个方面,并通过实际的代码案例来加深对指针的理解和应用。
前言:
在Go语言中,变量在内存中存储,而指针则指向这些内存地址。通过指针,我们可以通过内存地址直接访问和修改变量的值,这为Go语言提供了更高的性能和灵活性。本篇文章将带领读者逐步了解指针的概念和用法,帮助读者在日常的Go编程中更加熟练地使用指针。
一、指针
1.1 指针的概念
指针是存储另一个变量的内存地址的变量。
我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址。
一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。
在上面的图中,变量b的值为156,存储在内存地址0x1040a124。变量a持有b的地址,现在a被认为指向b。
1.2 获取变量的地址
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
package mainimport "fmt"func main() {var a int = 10 fmt.Printf("变量的地址: %x\n", &a )
}
运行结果:
变量的地址: 20818a220
1.3 声明指针
声明指针,*T是指针变量的类型,它指向T类型的值。
var var_name *var-type
var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针。
var ip *int /* 指向整型*/
var fp *float32 /* 指向浮点型 */
示例代码:
package mainimport "fmt"func main() {var a int= 20 /* 声明实际变量 */var ip *int /* 声明指针变量 */ip = &a /* 指针变量的存储地址 */fmt.Printf("a 变量的地址是: %x\n", &a )/* 指针变量的存储地址 */fmt.Printf("ip 变量的存储地址: %x\n", ip )/* 使用指针访问值 */fmt.Printf("*ip 变量的值: %d\n", *ip )
}
运行结果:
a 变量的地址是: 20818a220
ip 变量的存储地址: 20818a220
*ip 变量的值: 20
示例代码:
package mainimport "fmt"type name int8
type first struct {a intb boolname
}func main() {a := new(first)a.a = 1a.name = 11fmt.Println(a.b, a.a, a.name)
}
运行结果:
false 1 11
未初始化的变量自动赋上初始值
package mainimport "fmt"type name int8
type first struct {a intb boolname
}func main() {var a = first{1, false, 2}var b *first = &afmt.Println(a.b, a.a, a.name, &a, b.a, &b, (*b).a)
}
运行结果:
false 1 2 &{1 false 2} 1 0xc042068018 1
获取指针地址在指针变量前加&的方式
1.4 空指针
Go 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
一个指针变量通常缩写为 ptr。
空指针判断:
if(ptr != nil) /* ptr 不是空指针 */
if(ptr == nil) /* ptr 是空指针 */
1.5 获取指针的值
获取一个指针意味着访问指针指向的变量的值。语法是:*a
示例代码:
package main
import ( "fmt"
)func main() { b := 255a := &bfmt.Println("address of b is", a)fmt.Println("value of b is", *a)
}
1.6 操作指针改变变量的数值
示例代码:
package mainimport ( "fmt"
)func main() { b := 255a := &bfmt.Println("address of b is", a)fmt.Println("value of b is", *a)*a++fmt.Println("new value of b is", b)
}
运行结果
address of b is 0x1040a124
value of b is 255
new value of b is 256
1.7 使用指针传递函数的参数
示例代码
package mainimport ( "fmt"
)func change(val *int) { *val = 55
}
func main() { a := 58fmt.Println("value of a before function call is",a)b := &achange(b)fmt.Println("value of a after function call is", a)
}
运行结果
value of a before function call is 58
value of a after function call is 55
不要将一个指向数组的指针传递给函数。使用切片。
假设我们想对函数内的数组进行一些修改,并且对调用者可以看到函数内的数组所做的更改。一种方法是将一个指向数组的指针传递给函数。
package mainimport ( "fmt"
)func modify(arr *[3]int) { (*arr)[0] = 90
}func main() { a := [3]int{89, 90, 91}modify(&a)fmt.Println(a)
}
运行结果
[90 90 91]
示例代码:
package mainimport ( "fmt"
)func modify(arr *[3]int) { arr[0] = 90
}func main() { a := [3]int{89, 90, 91}modify(&a)fmt.Println(a)
}
运行结果
[90 90 91]
虽然将指针传递给一个数组作为函数的参数并对其进行修改,但这并不是实现这一目标的惯用方法。我们有切片。
示例代码:
package mainimport ( "fmt"
)func modify(sls []int) { sls[0] = 90
}func main() { a := [3]int{89, 90, 91}modify(a[:])fmt.Println(a)
}
运行结果:
[90 90 91]
Go不支持指针算法。
package main
func main() {
b := […]int{109, 110, 111}
p := &b
p++
}nvalid operation: p++ (non-numeric type *[3]int)
指针数组
package mainimport "fmt"const MAX int = 3func main() {a := []int{10,100,200}var i intfor i = 0; i < MAX; i++ {fmt.Printf("a[%d] = %d\n", i, a[i] )}
}
结果
a[0] = 10
a[1] = 100
a[2] = 200
有一种情况,我们可能需要保存数组,这样我们就需要使用到指针。
package mainimport "fmt"const MAX int = 3func main() {a := []int{10,100,200}var i intvar ptr [MAX]*int;for i = 0; i < MAX; i++ {ptr[i] = &a[i] /* 整数地址赋值给指针数组 */}for i = 0; i < MAX; i++ {fmt.Printf("a[%d] = %d\n", i,*ptr[i] )}
}
结果
a[0] = 10
a[1] = 100
a[2] = 200
1.8 指针的指针
指针的指针
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
var ptr **int;
package mainimport "fmt"func main() {var a intvar ptr *intvar pptr **inta = 3000/* 指针 ptr 地址 */ptr = &a/* 指向指针 ptr 地址 */pptr = &ptr/* 获取 pptr 的值 */fmt.Printf("变量 a = %d\n", a )fmt.Printf("指针变量 *ptr = %d\n", *ptr )fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
}
结果
变量 a = 3000
指针变量 *ptr = 3000
指向指针的指针变量 **pptr = 3000
指针作为函数参数
package mainimport "fmt"func main() {/* 定义局部变量 */var a int = 100var b int= 200fmt.Printf("交换前 a 的值 : %d\n", a )fmt.Printf("交换前 b 的值 : %d\n", b )/* 调用函数用于交换值* &a 指向 a 变量的地址* &b 指向 b 变量的地址*/swap(&a, &b);fmt.Printf("交换后 a 的值 : %d\n", a )fmt.Printf("交换后 b 的值 : %d\n", b )
}func swap(x *int, y *int) {var temp inttemp = *x /* 保存 x 地址的值 */*x = *y /* 将 y 赋值给 x */*y = temp /* 将 temp 赋值给 y */
}
结果
交换前 a 的值 : 100
交换前 b 的值 : 200
交换后 a 的值 : 200
交换后 b 的值 : 100
演示代码案例1:
package mainimport "fmt"func main() {/*指针:pointer存储了另一个变量的内存地址的变量。*///1.定义一个int类型的变量a := 10fmt.Println("a的数值是:",a) //10fmt.Printf("%T\n",a) //intfmt.Printf("a的地址是:%p\n",&a) //0xc00008a008//2.创建一个指针变量,用于存储变量a的地址var p1 *intfmt.Println(p1) //<nil>,空指针p1 = &a //p1指向了a的内存地址fmt.Println("p1的数值:",p1) //p1中存储的是a的地址fmt.Printf("p1自己的地址:%p\n",&p1)fmt.Println("p1的数值,是a的地址,该地址存储的数据:",*p1)//获取指针指向的变量的数值//3.操作变量,更改数值 ,并不会改变地址a = 100fmt.Println(a)fmt.Printf("%p\n",&a)//4.通过指针,改变变量的数值*p1 = 200fmt.Println(a)//5.指针的指针var p2 **intfmt.Println(p2)p2 = &p1fmt.Printf("%T,%T,%T\n",a,p1,p2) //int, *int, **intfmt.Println("p2的数值:",p2) //p1的地址fmt.Printf("p2自己的地址:%p\n",&p2)fmt.Println("p2中存储的地址,对应的数值,就是p1的地址,对应的数据:",*p2)fmt.Println("p2中存储的地址,对应的数值,再获取对应的数值:",**p2)}
运行截图:
运行结果:
GOROOT=D:\Go #gosetup
GOPATH=C:\Users\DELL\go #gosetup
D:\Go\bin\go.exe build -o C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day17_Pointer.exe D:\GolandProjects\Day17-Pointer\demo01_pointer.go #gosetup
C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day17_Pointer.exe
a的数值是: 10
int
a的地址是:0xc0000a6058
<nil>
p1的数值: 0xc0000a6058
p1自己的地址:0xc0000ca020
p1的数值,是a的地址,该地址存储的数据: 10
100
0xc0000a6058
200
<nil>
int,*int,**int
p2的数值: 0xc0000ca020
p2自己的地址:0xc0000ca028
p2中存储的地址,对应的数值,就是p1的地址,对应的数据: 0xc0000a6058
p2中存储的地址,对应的数值,再获取对应的数值: 200进程 已完成,退出代码为 0
演示代码案例2:
package mainimport "fmt"func main() {/*数组指针:首先是一个指针,一个数组的地址。*[4]Type指针数组:首先是一个数组,存储的数据类型是指针[4]*Type*[5]float64,指针,一个存储了5个浮点类型数据的数组的指针*[3]string,指针,数组的指针,存储了3个字符串[3]*string,数组,存储了3个字符串的指针地址的数组[5]*float64,数组,存储了5个浮点数据的地址的数组*[5]*float64,指针,一个数组的指针,存储了5个float类型的数据的指针地址的数组的指针*[3]*string,指针,存储了3个字符串的指针地址的数组的指针**[4]string,指针,存储了4个字符串数据的数组的指针的指针**[4]*string,指针,存储了4个字符串的指针地址的数组,的指针的指针*///1.创建一个普通的数组arr1 :=[4]int{1,2,3,4}fmt.Println(arr1)//2.创建一个指针,存储该数组的地址--->数组指针var p1 *[4]intp1 = &arr1fmt.Println(p1) //&[1 2 3 4]fmt.Printf("%p\n",p1) //数组arr1的地址fmt.Printf("%p\n",&p1) //p1指针自己的地址//3.根据数组指针,操作数组(*p1)[0] = 100fmt.Println(arr1)p1[0] = 200 //简化写法fmt.Println(arr1)//4.指针数组a := 1b := 2c := 3d := 4arr2 :=[4]int{a,b,c,d}arr3 :=[4]*int{&a,&b,&c,&d}fmt.Println(arr2) //[1 2 3 4]fmt.Println(arr3)arr2[0] =100fmt.Println(arr2)fmt.Println(a)*arr3[0] = 200fmt.Println(arr3)fmt.Println(a)b = 1000fmt.Println(arr2)fmt.Println(arr3)for i:=0;i<len(arr3);i++{fmt.Println(*arr3[i])}
}
运行截图:
运行结果:
GOROOT=D:\Go #gosetup
GOPATH=C:\Users\DELL\go #gosetup
D:\Go\bin\go.exe build -o C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day17_Pointer__1_.exe D:\GolandProjects\Day17-Pointer\demo02_pointerarray.go #gosetup
C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day17_Pointer__1_.exe
[1 2 3 4]
&[1 2 3 4]
0xc000012160
0xc00000a030
[100 2 3 4]
[200 2 3 4]
[1 2 3 4]
[0xc00001e100 0xc00001e108 0xc00001e110 0xc00001e118]
[100 2 3 4]
1
[0xc00001e100 0xc00001e108 0xc00001e110 0xc00001e118]
200
[100 2 3 4]
[0xc00001e100 0xc00001e108 0xc00001e110 0xc00001e118]
200
1000
3
4进程 已完成,退出代码为 0
演示代码案例3:
package mainimport "fmt"func main() {/*函数指针:一个指针,指向了一个函数的指针。因为go语言中,function,默认看作一个指针,没有*。slice,map,function指针函数:一个函数,该函数的返回值是一个指针。*/var a func()a = fun1a()arr1 := fun2()fmt.Printf("arr1的类型:%T,地址:%p,数值:%v\n", arr1, &arr1, arr1)arr2 := fun3()fmt.Printf("arr2的类型:%T,地址:%p,数值:%v\n", arr2, &arr2, arr2)fmt.Printf("arr2指针中存储的数组的地址:%p\n", arr2)
}
func fun3() *[4]int {arr := [4]int{5, 6, 7, 8}fmt.Printf("函数中arr的地址:%p\n", &arr)return &arr
}func fun2() [4]int { //普通函数arr := [4]int{1, 2, 3, 4}return arr
}func fun1() {fmt.Println("fun1().....")
}
运行截图:
运行结果:
GOROOT=D:\Go #gosetup
GOPATH=C:\Users\DELL\go #gosetup
D:\Go\bin\go.exe build -o C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day17_Pointer__2_.exe D:\GolandProjects\Day17-Pointer\demo03_pointerfunc.go #gosetup
C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day17_Pointer__2_.exe
fun1().....
arr1的类型:[4]int,地址:0xc0000d2020,数值:[1 2 3 4]
函数中arr的地址:0xc0000d20a0
arr2的类型:*[4]int,地址:0xc0000ca020,数值:&[5 6 7 8]
arr2指针中存储的数组的地址:0xc0000d20a0进程 已完成,退出代码为 0
演示代码案例4:
package mainimport "fmt"func main() {/*指针作为参数:参数的传递:值传递,引用传递*/a := 10fmt.Println("fun1()函数调用前,a:", a)fun1(a)fmt.Println("fun1()函数调用后,a:", a)fun2(&a)fmt.Println("fun2()函数调用后,a:", a)arr1 := [4]int{1, 2, 3, 4}fmt.Println("fun3()函数调用前:", arr1)fun3(arr1)fmt.Println("fun3()函数调用后:", arr1)fun4(&arr1)fmt.Println("fun4()函数调用后:", arr1)//s1 := []int{1, 2, 3, 4, 5}
}
func fun4(p2 *[4]int) { // 引用传递fmt.Println("fun4()函数中的数组指针:", p2)p2[0] = 200fmt.Println("fun4()函数中的数组指针:", p2)
}func fun3(arr2 [4]int) { // 值传递fmt.Println("fun3()函数中数组的:", arr2)arr2[0] = 100fmt.Println("fun3()函数中修改数组:", arr2)
}func fun1(num int) { // 值传递:num = a = 10fmt.Println("fun1()函数中,num的值:", num)num = 100fmt.Println("fun1()函数中修改num:", num)
}func fun2(p1 *int) { //传递的是a的地址,就是引用传递fmt.Println("fun2()函数中,p1:", *p1)*p1 = 200fmt.Println("fun2()函数中,修改p1:", *p1)
}
运行截图:
运行结果:
GOROOT=D:\Go #gosetup
GOPATH=C:\Users\DELL\go #gosetup
D:\Go\bin\go.exe build -o C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day17_Pointer__3_.exe D:\GolandProjects\Day17-Pointer\demo04_pointerparamter.go #gosetup
C:\Users\DELL\AppData\Local\JetBrains\GoLand2023.1\tmp\GoLand\___go_build_Day17_Pointer__3_.exe
fun1()函数调用前,a: 10
fun1()函数中,num的值: 10
fun1()函数中修改num: 100
fun1()函数调用后,a: 10
fun2()函数中,p1: 10
fun2()函数中,修改p1: 200
fun2()函数调用后,a: 200
fun3()函数调用前: [1 2 3 4]
fun3()函数中数组的: [1 2 3 4]
fun3()函数中修改数组: [100 2 3 4]
fun3()函数调用后: [1 2 3 4]
fun4()函数中的数组指针: &[1 2 3 4]
fun4()函数中的数组指针: &[200 2 3 4]
fun4()函数调用后: [200 2 3 4]进程 已完成,退出代码为 0
今日学习总结:
在本篇学习中,我们深入学习了Go语言中指针的概念和用法。我们了解了指针的基本概念,如何获取变量的地址和声明指针。我们还学习了空指针的概念以及如何获取指针的值。进一步地,我们了解了如何通过指针来改变变量的数值以及在函数参数传递中如何使用指针。最后,我们还了解了指针的指针,这在某些特定情况下非常有用。通过多个演示代码案例,我们加深了对这些概念的理解,并通过运行截图和结果展示了指针的实际应用场景。掌握了这些知识后,相信读者在Go语言编程中会更加游刃有余。
参考文献:
-
Donovan, A., & Kernighan, B. W. (2015). The Go Programming Language. Addison-Wesley Professional.
- 该书由Go语言的创始人之一Alan A. A. Donovan和Brian W. Kernighan合著,对Go语言的指针及其他重要概念进行了全面介绍,是学习Go语言的经典教材之一。
-
温航, 张煜皓, & 张淼. (2019). Go语言学习笔记. 电子工业出版社.
- 这本书是一本适合初学者的Go语言入门教材,其中包含了关于指针的基础知识和实例讲解。
-
Pike, R., & Thompson, K. (2020). The Go Memory Model. arXiv preprint arXiv:2003.11757.
- 该文献探讨了Go语言的内存模型,涉及到指针的使用和内存管理相关的内容,适合对Go语言底层原理感兴趣的读者。
-
Young, M. (2016). The Little Go Book. The Little Go Book.
- 这是一本小型的Go语言入门书籍,其中有关于指针的简洁介绍和示例。
-
A Tour of Go - Pointers. (官方教程)
- Go语言官方教程中有关于指针的章节,提供了指针的基本概念和使用方法,可作为初学者入门指针的参考资料。
结语
- 今天已学习
通过今天的学习,您已经踏上了Golang的学习之旅。在未来的日子里,您将探索Golang的各个方面,从基础概念到高级技巧,从实际应用到性能优化。
学习一门编程语言是一个持续的过程,每一天都是您向Golang的精通迈进的重要一步。我鼓励您坚持每天学习,保持热情和好奇心,解决挑战并享受成功的喜悦。
在您的学习旅程中,不要忘记参与社区和与其他Golang开发者交流。分享您的见解和经验,向他人学习,并在开源项目或实际应用中展示您的技能。
如果您在学习过程中遇到困难或有任何问题,不要犹豫向社区和专家寻求帮助。持续学习,勇敢探索,您将在Golang领域取得令人瞩目的成就。
最后,感谢您的阅读和支持!祝愿您在未来的每一天中都能够成为一名精通Golang的开发者!
期待听到您在学习过程中的进展和成就。如果您需要进一步的帮助,请随时告诉我。祝您在学习Golang的旅程中取得巨大成功!
点击
下方名片
,加入IT技术核心学习团队。一起探索科技的未来,共同成长。
如果您在学习过程中有任何疑惑,请点击下方名片,带您一对一快速入门 Go语言 的世界 ~
相关文章:

100天精通Golang(基础入门篇)——第17天:深入解析Go语言中的指针
🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《I…...

第七章:WILDCAT: 弱监督学习的深度卷积神经网络用于图像分类、点位定位和分割
0.摘要 本文介绍了WILDCAT,一种深度学习方法,它旨在通过对齐图像区域来获得空间不变性和学习强烈局部化特征。我们的模型仅使用全局图像标签进行训练,并致力于三个主要的视觉识别任务:图像分类、弱监督的逐点对象定位和语义分割。…...
Axios-post请求下载文件
场景背景 1.一般来说,都是使用get请求后台接口,如此后台返回文件流于浏览器,则可直接下载。 2.那么除一般情况,就有特殊情况,比如你的请求接口参数特别长,此时便不可使用get请求,get请求的参数…...

视频增强技术-对比度增强
在图像处理中,由于获取的图像质量不好,需要通过对比度增强来提升图片质量,主要解决的是由于图像灰度级范围较小造成的对比度较低的问题,作用是使图像的灰度级范围放大,从而让图像更加清晰。主要对比度增强方法包括线性…...

uni-app点击按钮弹出提示框(以弹窗的形式显示),选择确定和取消
学习目标: 学习目标如下所示: uni-app点击提交按钮后弹出提示框,(以弹窗的形式显示),提示用户是否确认提交(即确定和取消),点击确定后调用真正的提交方法,将数据传给后端…...
linux部署es+kibana
部署kibana与es 3.4.1、拷贝文件 首先把elasticsearch-7.3.1-linux-x86_64.tar.gz 和kibana-7.3.1-linux-x86_64.tar.gz拷贝到linux上,比如我是拷贝/usr/local 目录下 3.4.2、解压文件 然后分别执行tar -zxvf elasticsearch-7.3.1-linux-x86_64.tar.gz和tar -zx…...

二十三种设计模式第十七篇--迭代子模式
迭代子模式是一种行为型设计模式,它允许你按照特定方式访问一个集合对象的元素,而又不暴露该对象的内部结构。迭代子模式提供了一种统一的方式来遍历容器中的元素,而不需要关心容器的底层实现。 该模式包含以下几个关键角色: 迭…...

《零基础入门学习Python》第056讲:论一只爬虫的自我修养4:网络爬图
今天我们结合前面学习的知识,进行一个实例,从网络上下载图片,话说我们平时闲来无事会上煎蛋网看看新鲜事,那么,熟悉煎蛋网的朋友一定知道,这里有一个 随手拍 的栏目,我们今天就来写一个爬虫&…...
23.7.26总结(博客项目)
接下来要完成: 从主页面点击进入时,通过作者id从数据库查找作者的nickname点击文章收藏(需要有收藏列表)首页还要加最新发布,点赞收藏最多作者名得改成文章作者(通过user_id从user表中拿数据)消…...

安全第一天
1. 编码 1.1 ASCLL编码 ASCII 是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。 1.2 URL编码 URL:(统一资源定位器、定位地址,俗称网页…...

SpringCloud学习路线(12)——分布式搜索ElasticSeach数据聚合、自动补全、数据同步
一、数据聚合 聚合(aggregations): 实现对文档数据的统计、分析、运算。 (一)聚合的常见种类 桶(Bucket)聚合: 用来做文档分组。 TermAggregation: 按照文档字段值分组…...
cloudstack的PlugNicCommand的作用
PlugNicCommand是CloudStack中的一个命令,用于将一个网络接口卡(NIC)插入到虚拟机实例中。它的作用是将一个已存在的NIC连接到指定的虚拟机,以扩展虚拟机的网络功能。 具体来说,PlugNicCommand可以完成以下几个步骤&a…...

LT9211C 是一款MIPI/RGB/2PORT LVDS互转的芯片
LT9211C 1.描述: Lontium LT9211C是一个高性能转换器,可以在MIPI DSI/CSI-2/双端口LVDS和TTL之间相互转换,除了24位TTL到24位TTL,并且不推荐同步和DE的2端口10位LVDS和24位TTL之间的转换。LT9211C反序列化输入的MIPI/LVDS/TTL视…...
【Rust 基础篇】Rust 通道(Channel)
导言 在 Rust 中,通道(Channel)是一种用于在多个线程之间传递数据的并发原语。通道提供了一种安全且高效的方式,允许线程之间进行通信和同步。本篇博客将详细介绍 Rust 中通道的使用方法,包含代码示例和对定义的详细解…...

学习 C语言第二天 :C语言数据类型和变量(下)
目录: 1.变量的介绍以及存储 2.算术操作符、赋值操作符、单目操作符 3.scanf和printf的介绍 1.变量的介绍以及存储 1.1.变量的创建 了解了什么是类型了,类型是用来创建变量的。 变量是什么呢?在C语言当中不经常变的量称为常量,经常…...

【Kubernetes资源篇】ingress-nginx最佳实践详解
文章目录 一、Ingress Controller理论知识1、Ingress Controller、Ingress简介2、四层代理与七层代理的区别3、Ingress Controller中封装Nginx,为什么不直接用Nginx呢?4、Ingress Controller代理K8S内部Pod流程 二、实践:部署Ingress Control…...

Java基础阶段学习哪些知识内容?
Java是一种面向对象的编程语言,刚接触Java的人可能会感觉比较抽象,不要着急可以先从概念知识入手,先了解Java,再吃透Java,本节先来了解下Java的基础语法知识。 对象:对象是类的一个实例,有状态…...
【HISI IC萌新虚拟项目】ppu整体uvm验证环境搭建
关于整个虚拟项目,请参考: 【HISI IC萌新虚拟项目】Package Process Unit项目全流程目录_尼德兰的喵的博客-CSDN博客 前言 本篇文章完成ppu整体uvm环境搭建的指导,在进行整体环境搭建之前,请确认spt_utils、cpu_utils和ral_model均已经生成。此外,如果参考现在的工程目录…...

图像处理之hough圆形检测
hough检测原理 点击图像处理之Hough变换检测直线查看 下面直接描述检测圆形的方法 基于Hough变换的圆形检测方法 对于一个半径为 r r r,圆心为 ( a , b ) (a,b) (a,b)的圆,我们将…...
el-upload文件上传(只能上传一个文件且再次上传替换上一个文件) vue3+vite+ts
组件: <template><el-upload class"upload-demo" v-model:file-list"fileList" ref"uploadDemo" action"/public-api/api/file" multiple:on-preview"handlePreview" :on-remove"handleRemove&quo…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...