Go复合类型之数组类型
Go复合类型之数组
文章目录
- Go复合类型之数组
- 一、数组(Array)介绍
- 1.1 基本介绍
- 1.2 数组的特点
- 二、数组的声明与初始化
- 2.1 数组声明
- 2.2 常见的数据类型声明方法
- 2.3 数组的初始化
- 方式一:使用初始值列表初始化数组
- 方法二:根据初始值个数自动推断数组长度
- 方法三:通过指定索引值初始化数组
- 三、数组的常用操作
- 3.1 数组的遍历
- 方法1:使用 `for` 循环遍历
- 方法2:使用 `for range` 遍历
- 3.2 获取数组长度
- 3.3 访问数组元素
- 3.4 修改数组元素
- 3.5 数组的切片
- 3.6 数组的比较
- 3.7 数组作为函数参数
- 四、数组类型在内存中的实际表示
- 五、数组是值类型(数组拷贝和传参)
- 六、多维数组
- 6.1 二维数组
- 6.2.1 二维数组的定义
- 6.2.2 二维数组的遍历
- 6.3 多维数组介绍
- 6.4 多维数组声明与初始化
- 七、Go 数组和以往认知的数组的区别
一、数组(Array)介绍
1.1 基本介绍
- Go语言中数组是一个值类型(
value type
)。 - 数组就是指一系列同一类型数据的集合。
- 数组是一个长度固定的、由同构类型元素组成的连续序列。
- 数组类型包含两个重要属性:元素的类型和数组长度(元素的个数)。
- 数组长度在定义时确定,不可变更。
- 数组类型表示为:
[大小]T
,比如[5]int
表示拥有5个int元素的数组。 - 如果将数组作为函数的参数类型,则在函数调用时该参数将发生数据复制。因此,在函数体中无法修改传入的数组的内容,因为函数内操作的只是所传入数组的一个副本。
1.2 数组的特点
- 长度固定:一旦声明和初始化,数组的长度就不能更改。
- 类型一致:所有数组元素必须是相同类型。
- 连续的内存分配:数组的所有元素在内存中是连续分配的,这有助于快速访问元素。
- 值类型:数组是值类型,它们在传递给函数时会被复制,而不是引用。
二、数组的声明与初始化
2.1 数组声明
定义方式如下:
var arr [N]T
// 或者使用短变量申明
arr := [N]T{}
这里我们声明了一个数组变量 arr
,其中:
arr
为数组变量名N
表示数组长度T
表示数组存储类型
**如果两个数组类型的元素类型 T 与数组长度 N 都是一样的,那么这两个数组类型是等价的,如果有一个属性不同,它们就是两个不同的数组类型。**下面这个示例很好地诠释了这一点:
func foo(arr [5]int) {}
func main() {var arr1 [5]intvar arr2 [6]intvar arr3 [5]stringfoo(arr1) // okfoo(arr2) // 错误:[6]int与函数foo参数的类型[5]int不是同一数组类型foo(arr3) // 错误:[5]string与函数foo参数的类型[5]int不是同一数组类型
}
在这段代码里,arr2 与 arr3 两个变量的类型分别为[6]int 和 [5]string,前者的长度属性与[5]int 不一致,后者的元素类型属性与[5]int 不一致,因此这两个变量都不能作为调用函数 foo 时的实际参数。
2.2 常见的数据类型声明方法
var a [5]byte //长度为5的数组,每个元素为一个字节
var b [2*N] struct { x, y int5 } //复杂类型数组
var c [5]*int // 指针数组
var d [2][3]int //二维数组
var e [2][3][4]int //等同于[2]([3]([4]int))
2.3 数组的初始化
方式一:使用初始值列表初始化数组
这种方式在声明数组的同时,通过提供初始值列表来初始化数组元素。如果没有为数组的每个元素提供初始值,剩余的元素将会使用默认值。对于数值类型(如int),默认值为0;对于字符串类型(如string),默认值为空字符串。
var testArray [3]int //数组会初始化为int类型的零值var numArray = [3]int{1, 2} //使用指定的初始值完成初始化var strArray = [3]string{}fmt.Println(testArray) //[0 0 0]fmt.Println(numArray) //[1 2 0]fmt.Println(strArray) //[ ] 默认值空字符串
方法二:根据初始值个数自动推断数组长度
在这种方式下,你可以在声明数组时省略长度,并使用...
操作符,编译器会根据提供的初始值的个数自动推断数组的长度。这使得代码更加简洁,不需要显式指定数组的长度。
arr := [...]int{1, 2, 3} // [1 2 3]fmt.Println(arr) // [1 2]fmt.Printf("type of numArray:%T\n", arr) // type of numArray:[3]int
方法三:通过指定索引值初始化数组
这种方式允许你在数组的指定索引位置提供初始值,其他位置会被初始化为默认值。在示例中,a[1]
被初始化为1,a[3]
被初始化为5,其他位置默认为0。
func main() {a := [...]int{1: 1, 3: 5}fmt.Println(a) // [0 1 0 5]fmt.Printf("type of a:%T\n", a) //type of a:[4]int
}
三、数组的常用操作
3.1 数组的遍历
遍历数组有两种方法,使用for
循环和使用for range
语句
方法1:使用 for
循环遍历
var a = [...]string{"贾", "维", "斯"}
for i := 0; i < len(a); i++ {fmt.Println(a[i])
}
这是传统的for
循环遍历数组的方式,它使用一个循环变量i
来迭代数组的索引,然后使用a[i]
来访问数组的元素。这种方式适用于需要访问数组索引或按照索引进行操作的情况。
方法2:使用 for range
遍历
var a = [...]string{"贾", "维", "斯"}for index, value := range a {fmt.Println(index, value)}
for range
语句更加简洁和直观。它会返回数组的索引和对应的值,这使得遍历数组变得非常方便。通常情况下,使用for range
遍历数组更加推荐,特别是当你只需要访问数组的值而不需要索引时。
需要注意的是,for range
遍历数组会创建一个值的拷贝,而不是原始数组的引用。如果你需要在循环内修改数组元素的值,并且希望这些修改在循环结束后对原始数组生效,那么你应该使用for
循环,因为它允许你直接访问数组的元素。
3.2 获取数组长度
在Go语言中,数组长度在定义后就不可更改,在声明时长度可以为一个常量或者一个常量表达式(常量表达式是指在编译期即可计算结果的表达式)。数组的长度是该数组类型的一个内置常量,可以用Go语言的内置函数len()来获取。
arrLength := len(arr)
举个例子:
arr := [5]int{10, 20, 30, 40, 50}
length := len(arr) // 获取数组的长度,length的值为5
3.3 访问数组元素
-
数组的下标值是从 0 开始的
-
使用数组变量名加索引下标的方式就可以访问数组对应位置的元素。
var arr = [6]int{11, 12, 13, 14, 15, 16}
fmt.Println(arr[0], arr[5]) // 11 16
fmt.Println(arr[-1]) // 错误:下标值不能为负数
fmt.Println(arr[8]) // 错误:小标值超出了arr的长度范围
3.4 修改数组元素
- 同样是通过数组变量名加索引下标的方式就可以修改数组对应位置的元素。
arr := [5]int{1, 2, 3, 4, 5}arr[0] = 100 // 修改数组第一个元素
arr[1] = 200 // 修改数组第二个元素fmt.Println(arr) // 输出:[100 200 3 4 5]
3.5 数组的切片
使用切片来从数组中创建一个动态长度的子集。切片是对数组的引用,因此它们与原始数组共享底层数据。
arr := [5]int{10, 20, 30, 40, 50}
slice := arr[1:4] // 创建一个包含arr的索引1到3的切片,slice的值为{20, 30, 40}
3.6 数组的比较
你可以使用==
运算符来比较两个数组是否相等。两个数组相等的条件是它们的长度和元素都相同。
arr1 := [3]int{1, 2, 3}arr2 := [3]int{1, 2, 3}isEqual := arr1 == arr2 fmt.Println(isEqual) // isEqual为true
3.7 数组作为函数参数
数组是值类型,当它作为函数参数传递时,会复制整个数组。这意味着在函数内对数组的修改不会影响原始数组。
func modify(arr [3]int) {arr[0] = 100
}func main() {a := [3]int{1, 2, 3}modify(a)fmt.Println(a) // 输出[1, 2, 3]
}
// 在modify函数中,我们把数组arr的第一个元素修改为了100。但是回到main函数后,打印数组a时,它的第一个元素仍然是1。
如果需要在函数内修改数组,需要传入数组指针:
func modify(arr *[3]int) {(*arr)[0] = 100
}func main() {a := [3]int{1, 2, 3}modify(&a)fmt.Println(a) // 输出[100 2 3]
}
四、数组类型在内存中的实际表示
了解了数组类型的定义和操作后,我们再来看看数组类型在内存中的实际表示是怎样的,这是数组区别于其他类型,也是我们区分不同数组类型的根本依据。
**数组类型不仅是逻辑上的连续序列,而且在实际内存分配时也占据着一整块内存。**Go 编译器在为数组类型的变量实际分配内存时,会为 Go 数组分配一整块、可以容纳它所有元素的连续内存,如下图所示:
我们从这个数组类型的内存表示中可以看出来,这块内存全部空间都被用来表示数组元素,所以说这块内存的大小,就等于各个数组元素的大小之和。如果两个数组所分配的内存大小不同,那么它们肯定是不同的数组类型。Go 提供了预定义函数 len 可以用于获取一个数组类型变量的长度,通过 unsafe 包提供的 Sizeof 函数,我们可以获得一个数组变量的总大小,如下面代码:
var arr = [6]int{1, 2, 3, 4, 5, 6}
fmt.Println("数组长度:", len(arr)) // 6
fmt.Println("数组大小:", unsafe.Sizeof(arr)) // 48
数组大小就是所有元素的大小之和,这里数组元素的类型为 int
。在 64 位平台上,int 类型的大小为 8,数组 arr 一共有 6 个元素,因此它的总大小为 6x8=48 个字节。
五、数组是值类型(数组拷贝和传参)
数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值。
func modifyArray(x [3]int) {x[0] = 100
}func modifyArray2(x [3][2]int) {x[2][0] = 100
}
func main() {a := [3]int{10, 20, 30}modifyArray(a) //在modify中修改的是a的副本xfmt.Println(a) //[10 20 30]b := [3][2]int{{1, 1},{1, 1},{1, 1},}modifyArray2(b) //在modify中修改的是b的副本xfmt.Println(b) //[[1 1] [1 1] [1 1]]
}
注意:
- 数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的。
[n]*T
表示指针数组,*[n]T
表示数组指针 。
六、多维数组
6.1 二维数组
- 二维数组本质就是数组中又嵌套数组
6.2.1 二维数组的定义
组是最简单的多维数组,二维数组本质上是由一维数组组成的。二维数组定义方式如下:
var arrayName [ x ][ y ] variable_type
variable_type 为 Go 语言的数据类型,arrayName 为数组名,二维数组可认为是一个表格,x 为行,y 为列,下图演示了一个二维数组 a 为三行四列:
举个栗子,二维数组定义并初始化
func main() {a := [3][2]string{{"北京", "上海"},{"广州", "深圳"},{"成都", "重庆"},}fmt.Println(a) //[[北京 上海] [广州 深圳] [成都 重庆]]fmt.Println(a[2][1]) //支持索引取值:重庆
}
6.2.2 二维数组的遍历
func main() {a := [3][2]string{{"北京", "上海"},{"广州", "深圳"},{"成都", "重庆"},}for _, v1 := range a {for _, v2 := range v1 {fmt.Printf("%s\t", v2)}fmt.Println()}
}
输出:
北京 上海
广州 深圳
成都 重庆
注意: 多维数组只有第一层可以使用...
来让编译器推导数组长度。例如:
//支持的写法
a := [...][2]string{{"北京", "上海"},{"广州", "深圳"},{"成都", "重庆"},
}
//不支持多维数组的内层使用...
b := [3][...]string{{"北京", "上海"},{"广州", "深圳"},{"成都", "重庆"},
}
6.3 多维数组介绍
多维数组是一种数组的扩展,它允许在一个数组中存储多个维度的数据。在许多编程语言中,通常可以创建二维数组、三维数组,甚至更高维度的数组。多维数组在处理具有多个维度的数据集时非常有用,比如矩阵、图像等。
多维数组的基本思想是使用多个索引来引用数组中的元素。例如,二维数组可以看作是一个表格,需要两个索引来定位某个元素,第一个索引表示行号,第二个索引表示列号。三维数组则需要三个索引,依此类推。以下是多维数组的一些基本概念:
- 数组类型自身也可以作为数组元素的类型,这样就会产生多维数组。
- 多维数组在Go语言中不太常用,大多数情况下使用切片(slice)就可以实现多维数据结构。
- 但是在某些需要明确数组大小的情况下,多维数组也会用到。
6.4 多维数组声明与初始化
Go 语言支持多维数组,以下为常用的多维数组声明方式:
var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
比如下面的变量 mArr 的类型就是一个多维数组[2][3][4]int
:
var mArr [2][3][4]int
多维数组也不难理解,我们以上面示例中的多维数组类型为例,我们从左向右逐维地去看,这样我们就可以将一个多维数组分层拆解成这样:
我们从上向下看,首先我们将 mArr 这个数组看成是一个拥有两个元素,且元素类型都为[3] [4]int
的数组,就像图中最上层画的那样。这样,mArr
的两个元素分别为 mArr[0]
和 mArr [1]
,它们的类型均为[3] [4]int
,也就是说它们都是二维数组。
而以 mArr[0]为例,我们可以将其看成一个拥有 3 个元素且元素类型为[4]int 的数组,也就是图中中间层画的那样。这样 mArr[0]
的三个元素分别为 mArr[0][0]
、mArr[0][1]
以及 mArr[0][2]
,它们的类型均为[4]int
,也就是说它们都是一维数组。
图中的最后一层就是 mArr[0]
的三个元素,以及 mArr[1]
的三个元素的各自展开形式。以此类推,你会发现,无论多维数组究竟有多少维,我们都可以将它从左到右逐一展开,最终化为我们熟悉的一维数组。
不过,虽然数组类型是 Go 语言中最基础的复合数据类型,但是在使用中它也会有一些问题。数组类型变量是一个整体,这就意味着一个数组变量表示的是整个数组。这点与 C 语言完全不同,在 C 语言中,数组变量可视为指向数组第一个元素的指针。这样一来,无论是参与迭代,还是作为实际参数传给一个函数 / 方法,Go 传递数组的方式都是纯粹的值拷贝,这会带来较大的内存拷贝开销。
这时,你可能会想到我们可以使用指针的方式,来向函数传递数组。没错,这样做的确可以避免性能损耗。其实,Go 语言为我们提供了一种更为灵活、更为地道的方式 ,切片,来解决这个问题。
七、Go 数组和以往认知的数组的区别
在Go语言中,数组和一般认知中的数组(如C、C++等语言中的数组)有一些重要区别和特点。下面是关于Go语言中数组的一些特点和区别:
- 固定长度的序列: 与一般认知中的数组类似,Go中的数组也是一种同一种数据类型的固定长度的序列。这意味着一旦数组被定义,其长度不能更改。
- 数组定义: 在Go中,数组的定义形式为
var a [len]Type
,其中len
表示数组的长度,Type
表示数组元素的类型。例如,var a [5]int
定义了一个包含5个整数的数组。 - 长度是类型的一部分: 数组的长度是数组类型的一部分。因此,
[5]int
和[10]int
是不同的类型。这意味着不能将一个长度为5的数组赋值给一个长度为10的数组,它们是不兼容的。 - 下标访问: 类似于其他语言的数组,Go中的数组也可以通过下标进行访问,下标从0开始,最后一个元素的下标是
len-1
。可以使用for
循环或range
来遍历数组。 - 访问越界: 如果尝试访问数组中的索引超出合法范围,Go将会引发运行时错误,称为"越界访问",而不会继续执行程序。这是一种保护机制,以防止访问无效的内存。
- 数组是值类型: 在Go中,数组是值类型,这意味着当你将一个数组赋值给另一个数组时,实际上是将整个数组的副本复制给了目标数组,而不是引用。因此,在对副本进行更改时,不会影响原始数组。
- 支持比较操作: Go中的数组支持相等(
==
)和不等(!=
)操作符,因为数组在定义后会被初始化,所以它们是可比较的。 - 指针数组和数组指针: Go支持指针数组和数组指针的概念。指针数组是一个包含指向某种类型的指针的数组,而数组指针是指向数组的指针。
相关文章:
Go复合类型之数组类型
Go复合类型之数组 文章目录 Go复合类型之数组一、数组(Array)介绍1.1 基本介绍1.2 数组的特点 二、数组的声明与初始化2.1 数组声明2.2 常见的数据类型声明方法2.3 数组的初始化方式一:使用初始值列表初始化数组方法二:根据初始值个数自动推断数组长度方…...
rust闭包
一、闭包是什么 (一)闭包是什么 我们先来看看javascript中的闭包。 在函数外部无法读取函数内的局部变量。但是我们有时候需要得到函数内的局部变量,那么如何从外部读取局部变量?那就是在函数的内部,再定义一个函数。…...
通过位运算,实现单字段标识多个状态位
可能经常有如下这种需求: 需要一张表,来记录学员课程的通过与否. 课程数量不确定,往往很多,且会有变动,随时可能新增一门课. 这种情况下,在设计表结构时,一门课对应一个字段,就有些不合适, 因为不知道课程的具体数量,也无法应对后期课程的增加. 考虑只用一个状态标志位,利用位运…...
ALSA pcm接口的概念解释
PCM(数字音频)接口 PCM缩写: Pulse Code Modulation脉冲调制编码,我们理解为通过一定连续时间周期产生数字音频并带有音量样本的处理过程. 模拟信号被记录通过模拟到数字转换器,数字值(也就是某个特定时刻的音量值)获得来自ADC可以进一步处理,接下的图片展示的是个sine wavefor…...
logging的基本使用教程
logging的基本使用教程 一、简介: logging模块是Python的标准库,用于记录应用程序运行时的日志信息。使用logging模块可以帮助您在开发过程中调试代码、追踪问题和监控应用程序的运行状况。 二、使用教程 1、logging模块的基本使用方法: …...
ds套dp——考虑位置转移or值域转移:CF1762F
https://www.luogu.com.cn/problem/CF1762F 分析性质,就是我们选的数要么递增,要么递减(非严格)然后很明细是ds套dp, f i f_i fi 表示以 i i i 开头的答案然后考虑如何转移(ds套dp难点反而在转移而不是…...
stm32的GPIO寄存器操作以及GPIO外部中断,串口中断
一、学习参考资料 (1)正点原子的寄存器源码。 (2)STM32F103最小系统板开发指南-寄存器版本_V1.1(正点) (3)STM32F103最小系统板开发指南-库函数版本_V1.1(正点&a…...
生成对抗网络入门案例
前言 生成对抗网络(Generative Adversarial Networks,简称GANs)是一种用于生成新样本的机器学习模型。它由两个主要组件组成:生成器(Generator)和判别器(Discriminator)。生成器尝试…...
多头注意力机制
1、什么是多头注意力机制 从多头注意力的结构图中,貌似这个所谓的多个头就是指多组线性变换,但是并不是,只使用了一组线性变换层,即三个变换张量对 Q、K、V 分别进行线性变换,这些变化不会改变原有张量的尺寸…...
Qt + FFmpeg 搭建 Windows 开发环境
Qt FFmpeg 搭建 Windows 开发环境 Qt FFmpeg 搭建 Windows 开发环境安装 Qt Creator下载 FFmpeg 编译包测试 Qt FFmpeg踩坑解决方法1:换一个 FFmpeg 库解决方法2:把项目改成 64 位 后记 官方博客:https://www.yafeilinux.com/ Qt开源社区…...
[网鼎杯 2020 白虎组]PicDown python反弹shell proc/self目录的信息
[网鼎杯 2020 白虎组]PicDown - 知乎 这里确实完全不会 第一次遇到一个只有文件读取思路的题目 这里也确实说明还是要学学一些其他的东西了 首先打开环境 只存在一个框框 我们通过 目录扫描 抓包 注入 发现没有用 我们测试能不能任意文件读取 ?url../../../../etc/passwd …...
SDL2绘制ffmpeg解析的mp4文件
文章目录 1.FFMPEG利用命令行将mp4转yuv4202.ffmpeg将mp4解析为yuv数据2.1 核心api: 3.SDL2进行yuv绘制到屏幕3.1 核心api 4.完整代码5.效果展示6.SDL2事件响应补充6.1 处理方式-016.2 处理方式-02 本项目采用生产者消费者模型,生产者线程:使用ffmpeg将m…...
决策树C4.5算法的技术深度剖析、实战解读
目录 一、简介决策树(Decision Tree)例子: 信息熵(Information Entropy)与信息增益(Information Gain)例子: 信息增益比(Gain Ratio)例子: 二、算…...
LLMs Python解释器程序辅助语言模型(PAL)Program-aided language models (PAL)
正如您在本课程早期看到的,LLM执行算术和其他数学运算的能力是有限的。虽然您可以尝试使用链式思维提示来克服这一问题,但它只能帮助您走得更远。即使模型正确地通过了问题的推理,对于较大的数字或复杂的运算,它仍可能在个别数学操…...
【12】c++设计模式——>单例模式练习(任务队列)
属性: (1)存储任务的容器,这个容器可以选择使用STL中的队列(queue) (2)互斥锁,多线程访问的时候用于保护任务队列中的数据 方法:主要是对任务队列中的任务进行操作 &…...
Python之函数、模块、包库
函数、模块、包库基础概念和作用 A、函数 减少代码重复 将复杂问题代码分解成简单模块 提高代码可读性 复用老代码 """ 函数 """# 定义一个函数 def my_fuvtion():# 函数执行部分print(这是一个函数)# 定义带有参数的函数 def say_hello(n…...
SQL创建与删除索引
索引创建、删除与使用: 1.1 create方式创建索引:CREATE [UNIQUE – 唯一索引 | FULLTEXT – 全文索引 ] INDEX index_name ON table_name – 不指定唯一或全文时默认普通索引 (column1[(length) [DESC|ASC]] [,column2,…]) – 可以对多列建立组合索引 …...
网络协议--链路层
2.1 引言 从图1-4中可以看出,在TCP/IP协议族中,链路层主要有三个目的: (1)为IP模块发送和接收IP数据报; (2)为ARP模块发送ARP请求和接收ARP应答; (3…...
HDLbits: Count clock
目前写过最长的verilog代码,用了将近三个小时,编写12h显示的时钟,改来改去,估计只有我自己看得懂(吐血) module top_module(input clk,input reset,input ena,output pm,output [7:0] hh,output [7:0] mm,…...
【1day】用友移动管理系统任意文件上传漏洞学习
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...
【c++】向webrtc学习容器操作
std::map的key为std::pair 时的查找 std::map<RemoteAndLocalNetworkId, size_t> in_flight_bytes_RTC_GUARDED_BY(&lock_);private:using RemoteAndLocalNetworkId = std::pair<uint16_t, uint16_t...
SpringBoot+Vue3外卖项目构思
SpringBoot的学习: SpringBoot的学习_明里灰的博客-CSDN博客 实现功能 前台 用户注册,邮箱登录,地址管理,历史订单,菜品规格,购物车,下单,菜品浏览,评价,…...
【AI视野·今日NLP 自然语言处理论文速览 第四十七期】Wed, 4 Oct 2023
AI视野今日CS.NLP 自然语言处理论文速览 Wed, 4 Oct 2023 Totally 73 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Contrastive Post-training Large Language Models on Data Curriculum Authors Canwen Xu, Corby Rosset, Luc…...
c++的lambda表达式
文章目录 1 lambda表达式2 捕捉列表 vs 参数列表3 lambda表达式的传递3.1 函数作为形参3.2 场景1:条件表达式3.3 场景2:线程的运行表达式 1 lambda表达式 lambda表达式可以理解为匿名函数,也就是没有名字的函数,既然是函数&#…...
电梯安全监测丨S271W无线水浸传感器用于电梯机房/电梯基坑水浸监测
城市化进程中,电梯与我们的生活息息相关。高层住宅、医院、商场、学校、车站等各种商业体建筑、公共建筑中电梯为我们生活工作提供了诸多便利。 保障电梯系统的安全至关重要!特别是电梯机房和电梯基坑可通过智能化改造提高其安全性和稳定性。例如在暴风…...
Java异常:基本概念、分类和处理
Java异常:基本概念、分类和处理 在Java编程中,异常处理是一个非常重要的部分。了解如何识别、处理和避免异常对于编写健壮、可维护的代码至关重要。本文将介绍Java异常的基本概念、分类和处理方法,并通过简单的代码示例进行说明。 一、什么…...
小谈设计模式(19)—备忘录模式
小谈设计模式(19)—备忘录模式 专栏介绍专栏地址专栏介绍 备忘录模式主要角色发起人(Originator)备忘录(Memento)管理者(Caretaker) 应用场景结构实现步骤Java程序实现首先ÿ…...
《数据库系统概论》王珊版课后习题
第一章 绪论 1.数据、数据库、数据库管理系统、数据库系统的概念 (1)数据(Data):数据是数据库中存储的基本对象,是描述事物的符号记录。数据有多种表现形式,它们都可以经过数字化后存入计算机…...
MariaDB 修改用户远程登录
今天修改MariaDB数据库用户的Host时出现错误: ERROR 1356 (HY000): View ‘mysql.user’ references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them 我的步骤如下: 1.登陆 2.use mysql; 3.执行…...
Elasticsearch使用mapping映射定义以及基本的数据类型
1、说明 Elasticsearch的映射相当于数据库的数据字典,它定义了每个字段的名称和能够保存的数据类型,并且内置了20多种字段类型用于支持多种多样的结构化数据,这里仅介绍几种常用的字段类型,如需要了解全部的类型,请参…...
郑州做的比较好网站公司吗/搜索引擎免费登录入口
【100个】计算机理论英文参考文献供您参考,希望能解决毕业生们的计算机理论论文参考文献哪里找相关问题,整理好参考文献那就开始写计算机理论论文吧!一、计算机理论论文参考文献范文[1]抑制OFDM信号峰均比的PTS算法分析与优化.胡茂凯.陈西宏.刘强,2011陕…...
wordpress使用百度云存储/网站关键词
我想要做的是通过ajax和php调用一些数据库数据.但是ajax调用不起作用,我无法在网上找到解决方案.所以这是我的代码:test.php的include_once db_class.php;$cat $_GET[cat];$dbconn new dbconn(localhost, root, somepsw, blog);$dbconn->set_query("selec…...
外国做的中国动画视频网站/培训总结
多余的话不说,直接看代码: 1) 在 common/config/main.php 写入配置代码 1 // 配置翻译信息2 i18n > [3 translations > [4 app* > [ //app表示整个文件可以替换掉5 class &g…...
政府门户网站等保建设方案/2021小学生新闻摘抄
题解思路: 将所有条件存起来 枚举每个点是否为裁判,枚举时对涉及到此人的回合不进行操作,看是否出现矛盾,记录出现矛盾的回合。 如果仅有一点未出现矛盾,则此点为裁判,判断回合为max(出现矛盾的回合) 如果都…...
网站建设算行政工作吗/企业如何网络推广
输入输出参数: 给存储过程传参数,叫做输入参数,用户告诉存储过程需要 利用这个参数干些什么. 输出参数: 从存储过程得到那些数据. 创建一个可选参数的存储过程: create proc pa1 name varchar(50)NULL as if(name is not null)select * from a where name like name%; elsesele…...
嘉兴商城网站开发设计/推广方案如何写
1号进程是什么 当我们使用 /bin/bash 启动一个centos的容器 docker run -it --rm centos:7 /bin/bash那么启动命令就是1号进程 [rootded49b74042c /]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.2 0.0 11836 …...