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 main

import "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 main

import "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 main

import "fmt"

type name int8
type first struct {
	a int
	b bool
	name
}

func main() {
	a := new(first)
	a.a = 1
	a.name = 11
	fmt.Println(a.b, a.a, a.name)
}

运行结果:

false 1 11

未初始化的变量自动赋上初始值

package main

import "fmt"

type name int8
type first struct {
	a int
	b bool
	name
}

func main() {
	var a = first{1, false, 2}
	var b *first = &a
	fmt.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 := 255
    a := &b
    fmt.Println("address of b is", a)
    fmt.Println("value of b is", *a)
}

1.6 操作指针改变变量的数值

示例代码:

package main

import (  
    "fmt"
)

func main() {  
    b := 255
    a := &b
    fmt.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 main

import (  
    "fmt"
)

func change(val *int) {  
    *val = 55
}
func main() {  
    a := 58
    fmt.Println("value of a before function call is",a)
    b := &a
    change(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 main

import (  
    "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 main

import (  
    "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 main

import (  
    "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 main

import "fmt"

const MAX int = 3

func main() {

   a := []int{10,100,200}
   var i int

   for i = 0; i < MAX; i++ {
      fmt.Printf("a[%d] = %d\n", i, a[i] )
   }
}

结果

a[0] = 10
a[1] = 100
a[2] = 200

有一种情况,我们可能需要保存数组,这样我们就需要使用到指针。

package main

import "fmt"

const MAX int = 3

func main() {
   a := []int{10,100,200}
   var i int
   var 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 main

import "fmt"

func main() {

   var a int
   var ptr *int
   var pptr **int

   a = 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 main

import "fmt"

func main() {
   /* 定义局部变量 */
   var a int = 100
   var b int= 200

   fmt.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 int
   temp = *x    /* 保存 x 地址的值 */
   *x = *y      /* 将 y 赋值给 x */
   *y = temp    /* 将 temp 赋值给 y */
}

结果

交换前 a 的值 : 100
交换前 b 的值 : 200
交换后 a 的值 : 200
交换后 b 的值 : 100

演示代码案例1:



package main

import "fmt"

func main() {
	/*
	指针:pointer
		存储了另一个变量的内存地址的变量。

	 */
	 //1.定义一个int类型的变量
	 a := 10
	 fmt.Println("a的数值是:",a) //10
	 fmt.Printf("%T\n",a) //int
	 fmt.Printf("a的地址是:%p\n",&a) //0xc00008a008

	 //2.创建一个指针变量,用于存储变量a的地址
	 var p1 *int
	 fmt.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 = 100
	 fmt.Println(a)
	 fmt.Printf("%p\n",&a)

	 //4.通过指针,改变变量的数值
	 *p1 = 200
	 fmt.Println(a)

	 //5.指针的指针
	 var p2 **int
	 fmt.Println(p2)
	 p2 = &p1
	 fmt.Printf("%T,%T,%T\n",a,p1,p2) //int, *int, **int
	 fmt.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 main

import "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]int
	 p1 = &arr1
	 fmt.Println(p1) //&[1 2 3 4]
	 fmt.Printf("%p\n",p1) //数组arr1的地址
	 fmt.Printf("%p\n",&p1) //p1指针自己的地址

	 //3.根据数组指针,操作数组
	(*p1)[0] = 100
	fmt.Println(arr1)

	p1[0] = 200 //简化写法
	fmt.Println(arr1)

	//4.指针数组
	a := 1
	b := 2
	c := 3
	d := 4
	arr2 :=[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] =100
	fmt.Println(arr2)
	fmt.Println(a)
	*arr3[0] = 200
	fmt.Println(arr3)
	fmt.Println(a)

	b = 1000
	fmt.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 main

import "fmt"

func main() {
	/*
		函数指针:一个指针,指向了一个函数的指针。
			因为go语言中,function,默认看作一个指针,没有*。


			slice,map,function

		指针函数:一个函数,该函数的返回值是一个指针。

	*/
	var a func()
	a = fun1
	a()

	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 main

import "fmt"

func main() {
	/*
		指针作为参数:

		参数的传递:值传递,引用传递
	*/
	a := 10
	fmt.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] = 200
	fmt.Println("fun4()函数中的数组指针:", p2)
}

func fun3(arr2 [4]int) { // 值传递
	fmt.Println("fun3()函数中数组的:", arr2)
	arr2[0] = 100
	fmt.Println("fun3()函数中修改数组:", arr2)
}

func fun1(num int) { // 值传递:num = a = 10
	fmt.Println("fun1()函数中,num的值:", num)
	num = 100
	fmt.Println("fun1()函数中修改num:", num)
}

func fun2(p1 *int) { //传递的是a的地址,就是引用传递
	fmt.Println("fun2()函数中,p1:", *p1)
	*p1 = 200
	fmt.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语言编程中会更加游刃有余。

参考文献:

  1. Donovan, A., & Kernighan, B. W. (2015). The Go Programming Language. Addison-Wesley Professional.

    • 该书由Go语言的创始人之一Alan A. A. Donovan和Brian W. Kernighan合著,对Go语言的指针及其他重要概念进行了全面介绍,是学习Go语言的经典教材之一。
  2. 温航, 张煜皓, & 张淼. (2019). Go语言学习笔记. 电子工业出版社.

    • 这本书是一本适合初学者的Go语言入门教材,其中包含了关于指针的基础知识和实例讲解。
  3. Pike, R., & Thompson, K. (2020). The Go Memory Model. arXiv preprint arXiv:2003.11757.

    • 该文献探讨了Go语言的内存模型,涉及到指针的使用和内存管理相关的内容,适合对Go语言底层原理感兴趣的读者。
  4. Young, M. (2016). The Little Go Book. The Little Go Book.

    • 这是一本小型的Go语言入门书籍,其中有关于指针的简洁介绍和示例。
  5. A Tour of Go - Pointers. (官方教程)

    • Go语言官方教程中有关于指针的章节,提供了指针的基本概念和使用方法,可作为初学者入门指针的参考资料。

在这里插入图片描述

结语

  • 今天已学习

通过今天的学习,您已经踏上了Golang的学习之旅。在未来的日子里,您将探索Golang的各个方面,从基础概念到高级技巧,从实际应用到性能优化。
学习一门编程语言是一个持续的过程,每一天都是您向Golang的精通迈进的重要一步。我鼓励您坚持每天学习,保持热情和好奇心,解决挑战并享受成功的喜悦。

在您的学习旅程中,不要忘记参与社区和与其他Golang开发者交流。分享您的见解和经验,向他人学习,并在开源项目或实际应用中展示您的技能。

如果您在学习过程中遇到困难或有任何问题,不要犹豫向社区和专家寻求帮助。持续学习,勇敢探索,您将在Golang领域取得令人瞩目的成就。

最后,感谢您的阅读和支持!祝愿您在未来的每一天中都能够成为一名精通Golang的开发者!

期待听到您在学习过程中的进展和成就。如果您需要进一步的帮助,请随时告诉我。祝您在学习Golang的旅程中取得巨大成功!

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

如果您在学习过程中有任何疑惑,请点击下方名片,带您一对一快速入门 Go语言 的世界 ~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】数据库基础

目录 一、什么是数据库 二、主流数据库 三、基本使用 3.1MySQL安装 3.2连接服务器 3.3服务器管理 3.4服务器&#xff0c;数据库&#xff0c;表关系 3.5使用案例 3.6数据逻辑存储 四、MySQL架构 五、SQL分类 六、存储引擎 6.1存储引擎 6.2查看存储引擎 6.3 存储引…

数学随想:轻量级算法服务。

数学随想&#xff1a;轻量级算法服务TOC 通常认为&#xff0c;数列是算法服务的基础。但是&#xff0c;真正用于算法服务的数列只有几个众所周知的基础数列。虽然对于不同的任务可以选择使用数列的一段用于服务&#xff0c;但是数列的使用还是复杂而繁重的。特别是在计算应用日…

Github上方导航栏介绍

Code Watch&#xff1a;相当于关注&#xff0c;到时候这个项目又有什么操作&#xff0c;就会以通知的形式提醒你。 Fork&#xff1a;也就是把这个项目拉到你的仓库里&#xff0c;之后你可以对该代码进行修改&#xff0c;之后你可以发起Pull Request&#xff0c;简称PR&#xf…

《数据分析-JiMuReport08》JiMuReport报表开发-报表列数量开发限制调整

JiMuReport报表开发列数量限制调整 1.开发列数限制 JiMuReport报表在开发的时候&#xff0c;需要100-200列的数据&#xff0c;但是在设计到一定数量的时候&#xff0c;水平下拉框就不能滑动了 2.报表参数调整 col: n 在application.yml文件的jmreport配置处&#xff0c;如果想…

【指针和数组笔试题(2)】详解指针、数组笔试题

文章目录 前言第一组题第二组题第三组题二维数组&#xff08;难点&#xff09;总结 前言 来到第二章&#xff0c;继续学习指针和数组笔试题 第一组题 #include<stdio.h> int main() {char arr[] "abcdef";//里面的放的是[a b c d e f \0]printf("%d\n&…

LeetCode45.Jump-Game-II<跳跃游戏II>

题目&#xff1a; 思路&#xff1a; 从上次大神那里获得的灵感 这题问的是次数,那么我们需要确保 1,能否跳到终点 2,得到次数. 第一次条获得的是nums[0],那么第一个数就是我们第一次能跳跃的范围.每次在范围里获得最大值.并且次数加一.然后进入下一次范围;即可得到次数; 代码…

Redis源码篇 - inset数据结构

inset是Redis中set类型的一种底层存储结构&#xff08;编码&#xff09;&#xff0c;它是基于整数数组来实现的&#xff0c;用于存储数值类型set集合数据&#xff0c;并具备长度可变、有序等特征。 有序性 为了方便查找&#xff0c;Redis会将intset中整数数据按照从小到大的顺…

电商系统架构设计系列(六):电商的「账户系统」设计要特别考虑哪些问题?

上篇文章中&#xff0c;我给你留了一个思考题&#xff1a;电商的账户系统&#xff0c;该如何设计&#xff1f; 今天这篇文章&#xff0c;我们来说一下电商的账户系统。 引言 账户系统负责记录和管理用户账户的余额&#xff0c;这个余额就是每个用户临时存在电商的钱&#xff…

Jenkins从配置到实战(二) - Jenkins如何在多台机器上自动化构建

前言 jenkins除了支持在本机上进行项目构建&#xff0c;还可以将构建任务分发到其他远程服务器上去执行&#xff0c;可以实现在不同平台和架构的机器上来完成项目的自动化构建任务&#xff0c;也能减轻jenkins服务器的压力。本文章就主要介绍下此流程。 准备工作 准备两台机…

LeetCode[剑指Offer51]数组中的逆序对

难度&#xff1a;Hard 题目&#xff1a; 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制&#xff1a; 0 < 数组…

Unity进阶--声音管理器学习笔记

文章目录 声音管理器 using System.Collections; using System.Collections.Generic; using UnityEngine;public class AudioManager : MyrSingletonBase<AudioManager> {//环境音private AudioSource enPlayer;//音效private AudioSource sePlayer;//音乐private Audio…

欧姆龙CX系列PLC串口转以太网欧姆龙cp1hplc以太网连接电脑

你是否还在为工厂设备信息采集困难而烦恼&#xff1f;捷米特JM-ETH-CX转以太网通讯处理器为你解决这个问题&#xff01; 捷米特JM-ETH-CX转以太网通讯处理器专门为满足工厂设备信息化需求而设计&#xff0c;可以用于欧姆龙多个系列PLC的太网数据采集&#xff0c;非常方便构建生…

Centos7:Flask-Apache部署

系列文章目录 RHCE第0章&#xff1a;RHCE开始前的准备 RHCE第1章&#xff1a;Web服务器&#xff08;上&#xff09; RHCE第1章&#xff1a;Web服务器&#xff08;下&#xff09; RHCE第2章&#xff1a;DNS服务 RHCE第3章&#xff1a;DHCP服务器 RHCE第4章&#xff1a;Firewall…

VMware Fusion 14 Tech Preview - 适用于 Arm 的 Windows 11 上的全面 3D 加速

VMware Fusion 14 Tech Preview - 适用于 Arm 的 Windows 11 上的全面 3D 加速 VMware Fusion Tech Preview 2023 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-fusion-14/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;…

uniapp 微信小程序 input详解 带小数点的input、可查看密码的输入框input

官网文档地址 1、template <!-- 本示例未包含完整css&#xff0c;获取外链css请参考上文&#xff0c;在hello uni-app项目中查看 --> <template><view><view class"uni-common-mt"><view class"uni-form-item uni-column"&g…

LeetCode | Heap | 502.

502. IPO 是贪心算法in general。 一共两个变量&#xff1a;profit和capital。profit要求是找最大的。capital要求小于w。 两种筛选方法&#xff1a;把capital符合要求的排个序&#xff0c;找profit最大的。按照profit排序&#xff0c;从大到小找capital满足条件的。 哪种更…

前端密码加密 —— bcrypt、MD5、SHA-256、盐

&#x1f414; 前期回顾悄悄告诉你&#xff1a;前端如何获取本机IP&#xff0c;轻松一步开启网络探秘之旅_彩色之外的博客-CSDN博客前端获取 本机 IP 教程https://blog.csdn.net/m0_57904695/article/details/131855907?spm1001.2014.3001.5501 在前端密码加密方案中&#xff…

OSI七层模型和TCP/IP四层模型以及五层模型

OSI七层模型&#xff08;Open System Interconnect&#xff09;即开放系统互连参考模型&#xff0c;是由ISO&#xff08;International Organization for Standardization&#xff09;国际标准化组织提出的&#xff0c;用于计算机或通信系统间互联的标准体系。 从上到下可分为…

涵子来信——自己的电脑——谈谈想法

大家好&#xff1a; 上一次谈论了苹果的那些事&#xff0c;今天我们来聊聊电脑。 我的第一台电脑现在成了这样子&#xff1a; 很多人以为是我自己拆了电脑做研究&#xff0c;其实是我的第一台电脑&#xff0c;真的坏了。 2021年&#xff0c;我有了属于我自己的第一台电脑&am…

线性神经网络——softmax 回归随笔【深度学习】【PyTorch】【d2l】

文章目录 3.2、softmax 回归3.2.1、softmax运算3.2.2、交叉熵损失函数3.2.3、PyTorch 从零实现 softmax 回归3.2.4、简单实现 softmax 回归 3.2、softmax 回归 3.2.1、softmax运算 softmax 函数是一种常用的激活函数&#xff0c;用于将实数向量转换为概率分布向量。它在多类别…