go语言基础(二):切片

2023-05-16

切片的定义

切片的基本定义初始化如下:

	// 定义空切片
	a := []int{}
    // 切片第二种定义方式:
    var s1 []int //声明切片和声明数组一样,只是少了长度,此为空(nil)切片
    // 切片第三中定义方式,通过make( )函数实现
    //借助make函数, 格式 make(切片类型, 长度, 容量)
	s := make([]int, 5, 10)

什么是切片的长度与容量?

长度是已经初始化的空间(以上切片s初始空间默认值都是0)。容量是已经开辟的空间,包括已经初始化的空间和空闲的空间。

我们可以通过如下图来理解切片的长度与容量:
在这里插入图片描述

该切片的长度是5(存有数据,注意如果没有赋值,默认值都是0),容量是10,只不过有5个空闲区域。

即使没有给切片s赋值,初始化的空间(长度)默认存储的数据都是0。

​ 演示如下:

	a := make([]int, 5, 8)
	// [0 0 0 0 0]
	fmt.Println(a)

在使用make( )函数定义切片时,一定要注意,切片长度要小于容量,例如: s := make([]int, 10, 5)是错误的。

**make( )**函数中的容量参数是可以省略掉的,如:s := make([]int, 10),这时长度与容量是相等的,都是10.

GO语言提供了相应的函数来计算切片的长度与容量:len(),cap()

    a := make([]int, 5, 8)
	// 长度是: 5
	// 容量是: 8
	fmt.Println("长度是:", len(a))
	fmt.Println("容量是:", cap(a))    
切片截取
package main

import "fmt"

func main() {
	a := []int{10, 20, 30, 0, 0}
	// 从切片中截取数据 a[low:high:max]
	slice := a[0:3:5]
	// [10 20 30]
	fmt.Println(slice)
	// 3
	// 5
	fmt.Println(len(slice))
	fmt.Println(cap(slice))
}

a[low:high:max]:第一个数(low)表示下标的起点(从该位置开始截取),如果low取值为0表示从第一个元素开始截取,也就是对应的切片s中的10

第二个数(high)表示取到哪结束,也就是下标的终点(不包含该位置),3表示取出下标是0,1,2的数据(10,20,30),不包括下标为3的数据,那么也就是说取出的数据长度是3. 可以根据公式:3-0 计算(len=high-low),也就是第二个数减去第一个数,差就是数据长度。在这里可以将长度理解成取出的数据的个数。

第三个数用来计算容量,所谓容量:是指切片目前可容纳的最多元素个数。通过公式5-0计算(cap=max-low),也就是第三个数据减去第一个数。该案例中容量为5。

继续修改该程序

package main

import "fmt"

func main() {
	a := []int{10, 20, 30, 40, 50}
	// 从切片中截取数据 a[low:high:max]
	slice := a[1:4:5]
	// [20 30 40]
	fmt.Println(slice)
	// 3
	// 4
	fmt.Println(len(slice))
	fmt.Println(cap(slice))
}

那么容量是多少呢?容量为4,通过第三个数减去第一个数(5-1)计算。
在这里插入图片描述

通过上面的图,可以发现切片s经过截取操作以后,将结果赋值给切片slice后,长度是3,容量是4,只不过有一块区域是空闲的。

关于切片的截取还有其它的操作,如下所示:

操作含义
s[n]切片s中索引位置为n的项
s[:]从切片s的索引位置0到len(s)-1处所获得的切片
s[low:]从切片s的索引位置low到len(s)-1处所获得的切片
s[:high]从切片s的索引位置0到high处所获得的切片,len=high
s[low:high]从切片s的索引位置low到high处所获得的切片,len=high-low
s[low:high:max]从切片s的索引位置low到high处所获得的切片,len=high-low,cap=max-low
len(s)切片s的长度,总是<=cap(s)
cap(s)切片s的容量,总是>=len(s)

(1) s[n]

a := []int{10, 20, 30, 40, 50}
	// 从切片中截取数据 s[n]
	slice := a[2]
	// 30
	fmt.Println(slice)  

(2) s[:]

a := []int{10, 20, 30, 40, 50}
	// 从切片中截取数据 s[:]
	slice := a[:]
	// [10 20 30 40 50]
	fmt.Println(slice)
	//5
	//5
	fmt.Println(len(slice))
	fmt.Println(cap(slice))

(3)s[low:]

a := []int{10, 20, 30, 40, 50}
	// 从切片中截取数据 s[low:]
	slice := a[2:]
	// [30 40 50]
	fmt.Println(slice)
	//3
	//3    
	fmt.Println(len(slice))
	fmt.Println(cap(slice))

容量为3,分析:

a[2:]说明index(也即low)为2,且没有设置high和max,而a本来的容量为5,所以a[2:]的max=5。a[2:]的容量是:max-index=5-2=3

(4)s[:high]

a := []int{10, 20, 30, 40, 50}
	// 从切片中截取数据 s[:high]
	slice := a[:2]
	// [10 20]
	fmt.Println(slice)
	//2
	//5
	fmt.Println(len(slice))
	fmt.Println(cap(slice))

容量为5分析:

a[:2]说明high为2,且没有设置index和max,由上得index=0,max=5。a[2:]的容量是:max-index=5-0=5

(5)s[low:high]

a := []int{10, 20, 30, 40, 50}
	// 从切片中截取数据 s[low:high]
	slice := a[2:3]
	// [30]
	fmt.Println(slice)
	//1
	//3
	fmt.Println(len(slice))
	fmt.Println(cap(slice))

容量为3分析:

a[2:3]说明index=2,high=3,且没有设置max,由上max=5。a[2:3]的容量是:max-index=5-2=3

思考题

接下来说,思考如下题,定义一个切片a,然后对该切片a进行截取操作(范围自定义),得到新的切片slice, 并修改切片slice某个元素的值。代码如下:

a := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	// 从切片中截取数据 s[low:high]
	slice := a[2:5]
	// [2 3 4]
	fmt.Println(slice)

slice****切片的结果是:[2,3,4] 因为是从下标为2的元素(包含)开始取,到下标为5的元素(不包含)结束,取出3个元素,也就是长度为3。

现在将程序进行如下修改:

a := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	// 从切片中截取数据 s[low:high]
	slice := a[2:5]
	slice[2] = 888
	//slice= [2 3 888]
	//a= [0 1 2 3 888 5 6 7 8 9]
	fmt.Println("slice=", slice)
	fmt.Println("a=", a)

输出的结果如下:

slice= [2 3 888]
a= [0 1 2 3 888 5 6 7 8 9]

发现切片array中的值也发生了变化,也就是修改切片slice的值会影响到原切片a的值,下面通过画图的形式来说明其原因。

在这里插入图片描述

创建了切片a,然后基于截取得到了slice: slice := a[2:5]

slice指向了a切片,对应的值为 2,3,4

然后执行 slice[2] = 888

对应的slice[2]的值变为了888,当然slice的值也由4变为了888

下面继续修改上面的程序,创建一个新的切片:

	a := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	slice := a[2:5]
	slice[2] = 888
	slice2 := slice[2:7]
	//slice2= [888 5 6 7 8]
	//slice= [2 3 888]
	//a= [0 1 2 3 888 5 6 7 8 9]
	fmt.Println("slice2=", slice2)
	fmt.Println("slice=", slice)
	fmt.Println("a=", a)

上面程序的值为:

slice2= [888 5 6 7 8]
slice= [2 3 888]
a= [0 1 2 3 888 5 6 7 8 9]

主要是关注slice2,他是基于slice创建的又一个切片,其实很容易理解 第一个值为888。应为slice[2:],slice的索引为2的值正是888。但是为啥slice的长度为3的情况下,还输出了大于他长度的值嘞?这是因为slice指向了a,在slice[:7]满足不了slice后,他输出了a中的值给slice2。于是得到slice2= [888 5 6 7 8]

继续思考, 现在在原有的程序中又加了一行slice2[2] = 999,如下所示:

a := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	slice := a[2:5]
	slice[2] = 888
	slice2 := slice[2:7]
	slice2[2] = 999
	// 888 5 999 8
	fmt.Println("slice2=", slice2)
	// 2 3 888
	fmt.Println("slice=", slice)
	// 0 1 2 3 888 5 999 7 8 9
	fmt.Println("a=", a)

结果如下:

slice2= [888 5 999 7 8]
slice= [2 3 888]
a= [0 1 2 3 888 5 999 7 8 9]

根据上一个的推断,其实则会个也比较好理解。追本溯源,怎么来的就怎么回去。既然slice2除888是基于a得到的,那么修改slice2的值,只要不修改888,那么都会改变a的值。slice[2]对应a[6],所以slice2= [888 5 999 7 8]、a= [0 1 2 3 888 5 999 7 8 9]

继续思考:以上案例中,slice切片和slice2切片的容量分别是多少?

cap(slice):8

cap(slice2): 6

append函数

append函数是在原切片的末尾添加元素,如下:

package main

import "fmt"

func main() {
	a := []int{0, 1, 2, 3, 4, 5}

	//[0 1 2 3 4 5 4 5 6]
	a = append(a, 4, 5, 6)
	fmt.Println(a)
	
	//[0 1 2 3 4 5 4 5 6 5 6 7]
	a = append(a, 5, 6, 7)
	fmt.Println(a)
}

问题:可能有同学会问,如果容量不够用了,该怎么办呢?

例如有下面一个程序:

     a := make([]int, 5, 8)
	fmt.Println(a)
	fmt.Printf("len = %d, cap = %d\n", len(a), cap(a))

定义了一个切片a,初始化它的长度为5,容量为8。上面程序的输出如下:

[0 0 0 0 0]
len = 5, cap = 8

在上面的基础上,追加一个数:3

     a := make([]int, 5, 8)
	fmt.Println(a)
	fmt.Printf("len = %d, cap = %d\n", len(a), cap(a))
	
	a = append(a,3)
	fmt.Println(a)
	fmt.Printf("len = %d, cap = %d\n", len(a), cap(a))   

输出如下:

[0 0 0 0 0]
len = 5, cap = 8
[0 0 0 0 0 3]
len = 6, cap = 8

从输出的结果上,我们完全能够体会到,append函数的作用是在末尾追加(直接在默认值后面追加数据),由于追加了一个元素,所以长度为6.

下面我们继续通过append( )继续追加数据:

    a := make([]int, 5, 8)
	fmt.Println(a)
	fmt.Printf("len = %d, cap = %d\n", len(a), cap(a))

	a = append(a,3)
	a = append(a,4)
	a = append(a,5)
	fmt.Println(a)
	fmt.Printf("len = %d, cap = %d\n", len(a), cap(a))

输出如下:

[0 0 0 0 0]
len = 5, cap = 8
[0 0 0 0 0 3 4 5]
len = 8, cap = 8

追加完成3个数据后,长度变为了8,与容量相同。

那么如果现在通过append( )函数,继续向切片s中继续追加一个数据,那么容量会变为多少呢?

代码如下:

    a := make([]int, 5, 8)
	fmt.Println(a)
	fmt.Printf("len = %d, cap = %d\n", len(a), cap(a))

	a = append(a,3)
	a = append(a,4)
	a = append(a,5)
	a = append(a,6)
	fmt.Println(a)
	fmt.Printf("len = %d, cap = %d\n", len(a), cap(a))

输出如下:

[0 0 0 0 0]
len = 5, cap = 8
[0 0 0 0 0 3 4 5 6]
len = 9, cap = 16

追加完成一个数据后,长度变为9,大于创建切片s时的容量,所以切片s扩容,变为16.

那么切片的容量是否是以2倍容量来进行扩容的呢?

我们可以来验证一下:

package main

import "fmt"

func main() {
	a := make([]int, 0, 1)
	oldCap := cap(a)
	for i := 0; i < 200000; i++ {
		a = append(a, i)
		newCap := cap(a)
		if oldCap < newCap {
			fmt.Printf("cap: %d ===> %d\n", oldCap, newCap)
			oldCap = newCap
		}
	}
}

输出如下:

cap: 1 ===> 2
cap: 2 ===> 4
cap: 4 ===> 8
cap: 8 ===> 16
cap: 16 ===> 32
cap: 32 ===> 64
cap: 64 ===> 128
cap: 128 ===> 256
cap: 256 ===> 512
cap: 512 ===> 1024
cap: 1024 ===> 1280
cap: 1280 ===> 1696
cap: 1696 ===> 2304
cap: 2304 ===> 3072
cap: 3072 ===> 4096
cap: 4096 ===> 5120
cap: 5120 ===> 7168
cap: 7168 ===> 9216
cap: 9216 ===> 12288
cap: 12288 ===> 15360
cap: 15360 ===> 19456
cap: 19456 ===> 24576
cap: 24576 ===> 30720
cap: 30720 ===> 38912
cap: 38912 ===> 49152
cap: 49152 ===> 61440
cap: 61440 ===> 76800
cap: 76800 ===> 96256
cap: 96256 ===> 120832
cap: 120832 ===> 151552
cap: 151552 ===> 189440
cap: 189440 ===> 237568

通过以上的运行结果分析:当容量小于1024时是按照2倍容量扩容,当大于等于1024是不是按照2倍容量扩容。

copy函数

针对切片操作常用的方法除了append( )方法以外,还有copy方法.

基本语法:copy(切片1,切片2)

将第二个切片里面的元素,拷贝到第一个切片中。

下面通过一个案例,看一下该方法的使用:

package main

import "fmt"

func main() {
	a := make([]int, 4)
	b := []int{2, 3, 3, 3}
	fmt.Println(a)
	// 要赋值的slice放前面
	copy(a, b)
	fmt.Println(a)
}

输出如下:

[0 0 0 0]
[2 3 3 3]

上面要注意的是:a := make([]int, 4),这个不可以设为 a := make([]int, 0),如下:

    a := make([]int, 0)
	b := []int{2, 3, 3, 3}
	fmt.Println(a)
	// 要赋值的slice放前面
	copy(a, b)
	fmt.Println(a)

输出如下:

[]
[]
切片作为函数参数

切片也可以作为函数参数,那么与数组作为函数参数有什么区别呢?

接下来通过一个案例,演示一下切片作为函数参数。

package main

import "fmt"

func main() {
	a := make([]int, 10)
	initData(a)
	fmt.Println(a)
}

func initData(a []int) {
	for i := 0; i < len(a); i++ {
		a[i] = i
	}
}

输出如下:

[0 1 2 3 4 5 6 7 8 9]

通过以上案例,发现在主函数main( )中,定义了一个切片a,然后调用InitData( )函数,将切片a作为实参传递到该函数中,并在initData( )函数中完成初始化,该函数并没有返回值,但是在主函数中直接打印切片a,发现能够输出对应的值。也就是在initData( )函数中对形参切片num赋值,影响到了main( )函数中的切片a.

但是,大家仔细想一下,如果我们这里传递参数不是切片,而是数组,那么能否完成该操作呢?

答案是不能,这个我们之前是测试过的。

在GO语言中,数组作为参数进行传递是值传递,而切片作为参数进行传递是引用传递。

什么是值传递?什么是引用传递?

值传递:方法调用时,实参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值

引用传递:也称为传地址。函数调用时,实际参数的引用(地址,而不是参数的值)被传递给函数中相对应的形式参数(实参与形参指向了同一块存储区域),在函数执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。


输出如下:

```go
[0 0 0 0]
[2 3 3 3]

上面要注意的是:a := make([]int, 4),这个不可以设为 a := make([]int, 0),如下:

    a := make([]int, 0)
	b := []int{2, 3, 3, 3}
	fmt.Println(a)
	// 要赋值的slice放前面
	copy(a, b)
	fmt.Println(a)

输出如下:

[]
[]
切片作为函数参数

切片也可以作为函数参数,那么与数组作为函数参数有什么区别呢?

接下来通过一个案例,演示一下切片作为函数参数。

package main

import "fmt"

func main() {
	a := make([]int, 10)
	initData(a)
	fmt.Println(a)
}

func initData(a []int) {
	for i := 0; i < len(a); i++ {
		a[i] = i
	}
}

输出如下:

[0 1 2 3 4 5 6 7 8 9]

通过以上案例,发现在主函数main( )中,定义了一个切片a,然后调用InitData( )函数,将切片a作为实参传递到该函数中,并在initData( )函数中完成初始化,该函数并没有返回值,但是在主函数中直接打印切片a,发现能够输出对应的值。也就是在initData( )函数中对形参切片num赋值,影响到了main( )函数中的切片a.

但是,大家仔细想一下,如果我们这里传递参数不是切片,而是数组,那么能否完成该操作呢?

答案是不能,这个我们之前是测试过的。

在GO语言中,数组作为参数进行传递是值传递,而切片作为参数进行传递是引用传递。

什么是值传递?什么是引用传递?

值传递:方法调用时,实参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值

引用传递:也称为传地址。函数调用时,实际参数的引用(地址,而不是参数的值)被传递给函数中相对应的形式参数(实参与形参指向了同一块存储区域),在函数执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go语言基础(二):切片 的相关文章

  • C语言基础----流程控制

    流程控制是C语言中比较基础的 它分为三种状态 xff1a 1是顺序结构 2是选择结构 3是循环结构 我要说明后两种结构 xff0c 选择机构和循环结构 首先先说 xff1a 选择结构 选择结构是指 xff1a 当一个条件成立则执 xff08
  • c语言基础

    基本语法 预定义常量及类型 函数结果状态代码 span class token macro property span class token directive hash span span class token directive k
  • go语言基础(二):切片

    切片的定义 切片的基本定义初始化如下 xff1a span class token comment 定义空切片 span a span class token operator 61 span span class token punctu
  • Rust 中的基本数据类型——Rust语言基础06

    文章目录 1 前言2 标量类型 xff08 Scalar xff09 2 1 整型 xff08 Integer xff09 2 2 Rust 的整数形式2 3 奇怪的问题 xff08 整数的溢出 xff09 2 4 浮点类型 xff08 F
  • c语言基础——一维数组的应用

    C语言基础 一维数组的应用 例如 在一个学校的班级中会有很多学生 此时就可以使用数组来保存这些学生的姓名 以便进行管理 eg xff1a 用数组保存学生姓名 本示例每一个元素都应该是可以保存字符串的类型 这里使用字符指针类型 span cl
  • C语言基础(初识C语言)

    学习一门编程语言是一条艰辛与快乐共存的一条路 xff0c 如今选择了这条路 xff0c 就应该一直走下去 xff0c 了解 C 语言的基础知识 xff0c 要先对 C语言有一个大概的认识 xff0c 下面我介绍一下C语言的基础 一 什么是C
  • Linux下C语言基础——arm交叉编译器安装

    ubuntu 16 04下输入该命令 apt install gcc arm linux gnueabi 重新编译main c文件 arm linux gnueabi gcc o mian main c 执行main xff0c 如果是原来
  • python 语言基础 - 你不得不知道的字符串常用函数之isalpha

    前言 小伙伴们大家好 xff0c 每天一个小知识 xff0c 一起学python每天进步一点点 不知道小伙伴们在开发的时候有没有遇到这样一种场景 xff0c 有时候一些业务需要 xff0c 想要判断一个字符串是不是由纯字符组成 xff0c
  • python 语言基础 - 你不得不知道的字符串常用函数之isdigit

    前言 小伙伴们大家好 xff0c 每天一个小知识 xff0c 一起学python每天进步一点点 上一篇文章中为大家分享了关于判断字符串是否全都是由字符组成的函数isalpha xff0c 今天要给大家分享的依然是判断字符串组成的函数isdi
  • Kotlin语言基础-我的第一个Kotlin

    一 Kotlin简介 1 1 使用kotlin开发服务端1 2使用Kotlin开发Android应用1 3Kotlin用于JavaScript 二 使用命令行编译 运行Kotlin 2 1环境安装和配置2 2 第一个Kotlin程序2 3编
  • C语言基础----流程控制

    流程控制是C语言中比较基础的 它分为三种状态 xff1a 1是顺序结构 2是选择结构 3是循环结构 我要说明后两种结构 xff0c 选择机构和循环结构 首先先说 xff1a 选择结构 选择结构是指 xff1a 当一个条件成立则执 xff08
  • r语言集合补集_R语言基础-reshape2、tidyr、dplyr包

    一 reshape2包 数据 xff1a 氮肥和磷肥的用量对植物生长的影响 将上图数据做成txt文件 1 melt 函数 xff0c 将宽数据转换为长数据 转换NP数据集 2 dcast 函数 xff0c 将长数据转换为宽数据 二 tidy
  • go语言基础-gozero

    go基础 go 文档 Go语言的并发是基于 goroutine 的 xff0c goroutine 类似于线程 xff0c 但并非线程 可以将 goroutine 理解为一种虚拟线程 Go 语言运行时会参与调度 goroutine xff0
  • 献给面试学生 关键字const是什么意思 ESP(译者:Embedded Systems Programming) --Dan Saks概括了const的所有用法

    关键字const是什么含意 答 我只要一听到被面试者说 const意味着常数 我就知道我正在和一个业余者打交道 去年Dan Saks已经在他的文章里完全概括了const的所有用法 因此ESP 译者 Embedded Systems Prog
  • Chapter Two : Python 语言基础、运算符与表达式、程序的控制结构合集

    目录 一 Python 语言基础 1 Python 语法规则 2 关键字与标识符 3 变量 4 基本数据类型 5 输入与输出 二 运算符与表达式 1 算术运算符 2 赋值运算符 3 比较 关系 运算符 4 逻辑运算符 5 位运算符 6 赋值
  • 银行卡编码规则及检验算法详解

    一 银行卡结构 XXXXXX XXXXXXXXXXXX X 发卡行标识代码 自定义位 校验码 根据ISO标准 银行卡长度一般在13 19位 国际上也有12位的 银联标准卡卡长度一般是在16 19位 双组织卡也有13 19位的 二 发卡行标识
  • 什么是TPS,什么是QPS,区别是什么?

    一 TPS Transactions Per Second 每秒传输的事物处理个数 即服务器每秒处理的事务数 TPS包括一条消息入和一条消息出 加上一次用户数据库访问 业务TPS CAPS 每个呼叫平均TPS TPS是软件测试结果的测量单位
  • IDEA-常用配置

    一 Appearance Behavior 1 1 设置主题 1 2 设置窗体及菜单的字体及大小 二 Editor General 2 1 设置自动导包的功能 Add unambiguous imports on the fly 自动导入不
  • STL中的排序算法一览[By ACM郭老师]

    这篇文章我很喜欢 是郭老师的新作 希望大家喜欢 详细的从算法的效率方面来说明了排序算法 STL中有多种排序算法 各有各的适用范围 下面听我一一道来 I 完全排序 sort 首先要隆重推出的当然是最最常用的sort了 sort有两种形式 第一
  • shell 脚本命令太长,如何换行?

    再加ENTER

随机推荐

  • Ubuntu下能连上无线但不能上网

    Ubuntu下连上无线网以后 xff0c 无法上网问题 先确认是否可以访问网路 xff0c 使用一下命令 ping www baidu com 正常理论下 xff0c 上面一句应该是连不通 xff0c 会返回无法解析 然后我们再ping一下
  • uefi和legacy bios的深度剖析

    这个是我总结的 参考了几个论坛还有 鸟哥的私房菜 还有一部分是我自己的经验 适合初步了解uefi和legacy的人更深入的了解 uefi amp legacy Legacy 1 我们可将MBR磁盘分区结构用下图简单表示 xff08 Wind
  • 大数据Hadoop生态圈介绍

    大数据Hadoop生态圈 组件介绍 Hadoop是目前应用最为广泛的分布式大数据处理框架 xff0c 其具备可靠 高效 可伸缩等特点 Hadoop的核心组件是HDFS MapReduce 随着处理任务不同 xff0c 各种组件相继出现 xf
  • Mybatis Plus如何使用自定义方法实现分页呢?

    转自 Mybatis Plus如何使用自定义方法实现分页呢 下文笔者讲述Mybatis之Plus实现自定义分页的方法分享 如下所示 写在前面的话 在以前没有自定义分页方法时 我们使用Limit currIndex 和 pageSize 在M
  • ESP32使用ESP-IDF,以太网联网和WIFI网络切换注意事项

    记录一个使用问题 xff0c 以便有需要的道友查阅 需要实现的功能 xff1a 在上电一次对有线无线进行检测 xff0c 联网的优先级为有线 gt 无线 问题 xff1a 在程序编写的初步 xff0c 写了两个网络回调函数并进行初始化操作
  • camera中的VSYNC,HSYNC作用?时序关系?

    HSYNC xff1a 行锁存 xff0c 换行信号 VSYNC xff1a 祯锁存 xff0c 换页信号 320 240的屏 xff0c 每一行需要输入320个脉冲来依次移位 锁存进一行的数据 xff0c 然后来个HSYNC 脉冲换一行
  • 常见 win32.com 操作

    import win32com client from win32api import RGB xlapp 61 win32com client gencache EnsureDispatch 34 Ket Application 34 x
  • Mac 使用brew 问题(很慢)

    brew install or brew update 都很慢 xff01 使用国内的镜像 xff1a 1 替换现有上游 git C 34 brew repo 34 remote set url origin https mirrors t
  • ubuntu 安装PHP扩展

    sudo apt get install php7 0 bcmath sudo apt get install php7 0 bz2 sudo apt get install php7 0 calendar sudo apt get ins
  • vue3 ts 中ref 调用子组件的方法

    const uploadModal 61 ref 数据中return return t value onSearch toRefs state columns getBasicColumns handleTableChange create
  • 在mac电脑上,用Safari浏览器调试ios手机移动端页面

    打开iphone手机的开发者模式 xff0c 流程是 xff1a 设置 gt Safari gt 高级 gt 开启 Web检查器 具体如下图所示 打开Mac上Safari的开发者模式 xff0c 流程是 Safari gt 偏好设置 gt
  • wordpress 网站迁移

    1 网站打包上传 2 数据备份上传 3 数据库里中的域名修改 UPDATE wp options SET option value 61 replace option value 39 old domain com 39 39 new do
  • 【go 格式化代码】

    gofmt l w s sample bucket metaquery go gofmt main go
  • go build

    1 MAC 下编译 Linux Windows linux CGO ENABLED 61 0 GOOS 61 linux GOARCH 61 amd64 go build o name main go windows CGO ENABLED
  • 给docker中的PHP安装 gd扩展

    在容器内使用docker php ext install gd安装gd xff0c 使用过程中一些程序报错Call to undefined function imagettftext 在phpinfo中发现它只支持png xff0c 所以
  • Ubuntu内核升级以及如何开启BBR加速(亲测可行,速度确实有所加快)

    BBR是个什么东西我就不赘述了 xff0c 可以理解为和锐速差不多的一个东西 xff0c 但是呢 xff0c 锐速过高的价格和不再低端售卖 导致了我们并无法实现一个免费好用的单边加速功能 xff1b 所以 xff0c 在这个前提下 xff0
  • android wifi ap 自动开启

    花了几天时间 xff0c 了解了下android wifi 从上到下的流程 实现了自动开启wifi热点 找到了些资料 在这分享给大家了 xff01 http blog csdn net androidchuxueze article det
  • mac 笔记本安装vue,始终找不到命令

    亲测有效 这种问题我已经解决了 xff0c 主要是你的npm全局路径不对导致的 npm安装一些常见工具比如 gulp npm install g gulp 提示安装成功之后 xff0c 使用发现不存在comman gulp 这个时候我们要检
  • python selenium 爬取领英的数据

    coding utf 8 import os import pickle import time from selenium import webdriver from selenium webdriver support wait imp
  • go语言基础(二):切片

    切片的定义 切片的基本定义初始化如下 xff1a span class token comment 定义空切片 span a span class token operator 61 span span class token punctu