理解Go中的数据类型
引言
数据类型指定了编写程序时特定变量存储的值的类型。数据类型还决定了可以对数据执行哪些操作。
在本文中,我们将介绍Go的重要数据类型。这不是对数据类型的详尽研究,但将帮助您熟悉Go中可用的选项。理解一些基本的数据类型能让你写出更清晰、性能更高效的代码。
背景
理解数据类型的一种方法是考虑我们在现实世界中使用的不同类型的数据。现实世界中数据的一个例子是数字:例如,我们可以使用整数(0,1,2,…)、整数(…,-1,0,1,…)和无理数(π)。
通常,在数学中,我们可以组合不同类型的数字,并得到某种答案。我们可能想将π加5,例如:
5 + π
我们可以保留这个方程作为无理数的答案,也可以将π四舍五入到一个小数位较少的数字中,然后再将它们相加:
5 + π = 5 + 3.14 = 8.14
但是,如果我们开始尝试用另一种数据类型(如单词)计算数字,就会变得不那么有意义。我们如何解下面的方程?
shark + 8
对于计算机来说,每种数据类型都非常不同,就像单词和数字一样。因此,我们必须小心如何使用不同的数据类型来赋值,以及如何通过操作操作它们。
Integers
与数学一样,计算机编程中的整数是整数,可以是正、负或0(…,- 1,0,1,…)。在Go中,整数被称为int
。与其他编程语言一样,在4位或4位以上的数字中不应该使用逗号,因此,在程序中编写1000时,请将其写成1000
。
可以像下面这样简单地打印一个整数:
fmt.Println(-459)
Output-459
或者,我们可以声明一个变量,在本例中,它是我们正在使用或操作的数字的符号,如下所示:
var absoluteZero int = -459
fmt.Println(absoluteZero)
Output-459
我们也可以在Go中使用整数进行数学运算。在下面的代码块中,我们将使用:=
赋值操作符来声明和实例化变量sum
:
sum := 116 - 68
fmt.Println(sum)
Output48
如输出所示,数学运算符-
将116
减去整数68
,得到48
。你将在为变量声明数据类型部分了解更多关于变量声明的内容。
在Go程序中,整数可以以多种方式使用。随着您继续学习Go,您将有很多机会使用整数并在此数据类型的知识基础上进行工作。
浮点数
浮点数或浮点数用于表示不能表示为整数的实数。实数包含所有有理数和无理数,因此浮点数可以包含小数部分,如9.0或-116.42。为了理解Go程序中的浮点数,它是一个包含小数点的数字。
像处理整数一样,可以像下面这样简单地打印一个浮点数:
fmt.Println(-459.67)
Output-459.67
还可以声明一个变量来表示浮点数,如下所示:
absoluteZero := -459.67
fmt.Println(absoluteZero)
Output-459.67
就像整数一样,我们也可以在Go中使用浮点数进行数学运算:
var sum = 564.0 + 365.24
fmt.Println(sum)
Output929.24
对于整数和浮点数,重要的是要记住3≠3.0,因为3指整数,而3.0指浮点数。
数值类型的大小
除了整数和浮点数之间的区别之外,Go还有两种类型的数值数据,它们的区别在于其大小的静态或动态性质。第一种类型是体系结构无关类型,这意味着无论代码在什么机器上运行,以位为单位的数据长度都不会改变。
今天的大多数系统体系结构不是32位就是64位。例如,你可能正在为一台现代的Windows笔记本电脑开发应用程序,其操作系统运行在64位体系结构上。但是,如果您正在为健身手表之类的设备开发,则可能需要使用32位架构。如果你使用体系结构无关的类型,如int32
,无论你编译的是什么体系结构,该类型都将具有固定的大小。
第二种是特定于实现的类型。在这种类型中,位长可能因程序所基于的体系结构而异。例如,如果我们使用int
类型,当Go编译为32位体系结构时,数据类型的大小将为32位。如果程序是针对64位体系结构编译的,则该变量的大小为64位。
除了有不同大小的数据类型,像整数这样的数据类型也有两种基本类型:有符号和无符号。int8
是一个有符号整数,它的值可以是-128到127。uint8
是一个无符号整数,只能是0 ~ 255的正数。
这些范围是基于位的大小。对于二进制数据,8位可以表示256个不同的值。因为int
类型需要同时支持正数和负数,一个8位整数(int8
)的范围是-128到127,总共有256个不同的可能值。
Go有以下体系结构无关的整数类型:
uint8 无符号8位整数 (0 to 255)
uint16 无符号16位整数 (0 to 65535)
uint32 无符号32位整数 (0 to 4294967295)
uint64 无符号64位整数 (0 to 18446744073709551615)
int8 带符号的8位整数 (-128 to 127)
int16 带符号的16位整数 (-32768 to 32767)
int32 带符号的32位整数 (-2147483648 to 2147483647)
int64 带符号的64位整数 (-9223372036854775808 to 9223372036854775807)
浮点数和复数的大小也各不相同:
float32 IEEE-754 32位浮点数
float64 IEEE-754 64位浮点数
complex64 具有float32类型变量实部和虚部的复数
complex128 具有float64类型变量实部和虚部的复数
还有一些别名编号类型,可以为特定的数据类型指定有用的名称。
byte uint8的别名
rune int32的别名
byte
别名的目的是,当你的程序使用字节作为字符串元素的常见计算度量时,而不是与字节数据度量无关的小整数时,可以明确这一点。即使byte
和uint8
在程序编译时是相同的,byte
通常用于表示数字形式的字符数据,而uint8
在程序中是一个数字。
rune
别名有点不同。其中byte
和uint8
是完全相同的数据,rune
可以是一个字节或四个字节,一个范围由int32
决定。rune
用于表示Unicode字符,而只有ASCII字符可以只用int32
数据类型表示。
此外,Go有以下特定于实现的类型:
uint 无符号,32或64位
int 有符号,32或64位
uintptr 大到足以存储指针值的未解释位的无符号整数
特定于实现的类型的大小由编译程序的体系结构定义。
选择数值数据类型
选择正确的大小通常与您正在编程的目标架构的性能有关,而不是与您正在使用的数据的大小有关。不过,在不需要知道程序性能的具体影响的情况下,你可以在刚开始时遵循这些基本指导方针。
如本文前面所讨论的,有体系结构无关的类型和特定于实现的类型。对于整数数据,通常在Go中使用int
或uint
等实现类型,而不是int64
或uint64
。这通常会为您的目标架构带来最快的处理速度。例如,如果你使用int64
并编译为32位架构,那么处理这些值需要至少两倍的时间,因为在架构中移动数据需要额外的CPU周期。如果你使用int
,程序会将其定义为32位体系结构的32位大小,处理速度会明显更快。
如果您知道不会超过特定的大小范围,那么选择一种体系结构无关的类型可以提高速度并减少内存使用。例如,如果你知道你的数据不会超过100
的值,并且只会是一个正数,那么选择uint8
将使你的程序更高效,因为它将需要更少的内存。
我们已经了解了数值数据类型的一些可能的范围,下面来看看在程序中超出这些范围会发生什么。
溢出vs.环绕
当您尝试存储大于设计数据类型的值时,Go有可能溢出数字和包装数字,这取决于该值是在编译时还是在运行时计算的。当程序在尝试构建程序时发现错误时,就会发生编译时错误。运行时错误发生在程序被编译之后,但它实际上正在执行。
在下面的例子中,我们将maxint32
设置为最大值:
package mainimport "fmt"func main() {var maxUint32 uint32 = 4294967295 // Max uint32 sizefmt.Println(maxUint32)
}
它将编译并运行,结果如下:
Output4294967295
如果我们在运行时给值加上1
,它会被转换成0
:
Output0
另一方面,让我们修改程序,在编译前给变量赋值时加上1
:
package mainimport "fmt"func main() {var maxUint32 uint32 = 4294967295 + 1fmt.Println(maxUint32)}
在编译时,如果编译器可以确定指定的数据类型容纳的值太大,它将抛出overflow
错误。这意味着计算的值对于指定的数据类型来说太大。
因为编译器可以确定它会溢出这个值,所以它会抛出一个错误:
Outputprog.go:6:36: constant 4294967296 overflows uint32
理解数据的边界将帮助你在将来的程序中避免潜在的错误。
我们已经介绍了数值类型,下面来看看如何存储布尔值。
布尔值
boolean数据类型可以是两个值之一,true
或false
,当声明它为数据类型时,它被定义为bool
。布尔值用于表示与数学逻辑分支相关的真值,它指示计算机科学中的算法。
值true
和false
将始终分别是小写的t
和f
,因为它们是Go中预先声明的标识符。
许多数学运算的结果要么为true,要么为false:
- 大于
- 500 > 100 true
- 1 > 5 false
- 小于
- 200 < 400 true
- 4 < 2 false
- 等于
- 5 = 5 true
- 500 = 400 false
和数字一样,我们也可以将布尔值存储在变量中:
myBool := 5 > 8
然后我们可以调用fmt.Println()
函数来打印布尔值:
fmt.Println(myBool)
由于5
不大于8
,我们将收到以下输出:
Outputfalse
随着你在Go中编写更多的程序,你将更加熟悉布尔值的工作原理,以及计算为true
或false
的不同函数和操作如何改变程序的进程。
字符串
字符串是由一个或多个字符(字母、数字、符号)组成的序列,可以是常量,也可以是变量。在Go中,字符串存在于反引号`
或双引号"
中,并根据您使用的引号具有不同的特征。
如果你使用反引号,你就是在创建一个原始字符串字面量。如果你使用双引号,你是在创建一个解释字符串字面量。
原始字符串字面量
原始字符串字面量是位于反引号之间的字符序列,通常称为反引号。在引号内,任何字符都将与反引号之间显示的字符一样,除了反引号字符本身。
a := `Say "hello" to Go!`
fmt.Println(a)
OutputSay "hello" to Go!
通常,反斜杠用于表示字符串中的特殊字符。例如,在解释字符串中,\n
表示字符串中的新行。然而,反斜杠在原始字符串字面量中没有特殊含义:
a := `Say "hello" to Go!\n`
fmt.Println(a)
因为反斜杠在字符串字面量中没有特殊的含义,它实际上会打印出\n
的值,而不是新建一行:
OutputSay "hello" to Go!\n
原始字符串字面量也可以用来创建多行字符串:
a := `This string is on
multiple lines
within a single back
quote on either side.`
fmt.Println(a)
OutputThis string is on
multiple lines
within a single back
quote on either side.
在前面的代码块中,新行从输入转移到输出。
解释的字符串字面量
解释字符串字面量是双引号之间的字符序列,如"bar"
。在引号中,除了换行符和未转义的双引号外,任何字符都可以出现。要在解释过的字符串中显示双引号,可以使用反斜杠作为转义字符,如下所示:
a := "Say \"hello\" to Go!"
fmt.Println(a)
OutputSay "hello" to Go!
几乎总是使用解释过的字符串字面量,因为它们允许转义字符。
包含UTF-8字符的字符串
UTF-8是一种编码方案,用于将可变宽度字符编码为1到4个字节。Go支持开箱即用的UTF-8字符,不需要任何特殊设置、库或包。罗马字符(如字母 A
)可以用ASCII值(如数字65)表示。但是,对于特殊字符,如国际字符世
,则需要使用UTF-8。Go对UTF-8数据使用rune
别名类型。
a := "Hello, 世界"
你可以在for
循环中使用range
关键字来索引Go中的任何字符串,即使是UTF-8字符串。for
循环和range
将在本系列的后面部分更深入地介绍;现在,重要的是要知道,我们可以使用它来对给定字符串中的字节数进行计数:
package mainimport "fmt"func main() {a := "Hello, 世界"for i, c := range a {fmt.Printf("%d: %s\n", i, string(c))}fmt.Println("length of 'Hello, 世界': ", len(a))
}
在上面的代码块中,我们声明了变量a
,并将值Hello,世界
赋给它。赋值的文本包含UTF-8字符。
然后我们使用标准的for
循环和range
关键字。在Go中,range
关键字将索引一个每次返回一个字符的字符串,以及该字符在字符串中的字节索引。
使用fmt.Printf
函数,我们提供了一个%d: %s\n
的格式字符串。’ %d '是数字(在本例中是整数)的打印动词,而%s
是字符串的打印动词。然后我们提供了i
的值,i
是for
循环的当前索引,c
是for
循环的当前字符。
最后,我们使用内置的len
函数打印出变量a
的整个长度。
前面我们提到过,rune是int32
的别名,由1到4个字节组成。世
字符需要三个字节来定义,在UTF-8字符串范围内,索引相应地移动。这就是i
在打印出来时不是顺序的原因。
Output0: H
1: e
2: l
3: l
4: o
5: ,
6:
7: 世
10: 界
length of 'Hello, 世界': 13
如你所见,这个长度比在字符串上进行范围搜索的次数要长。
你不会总是使用UTF-8字符串,但当你使用时,你现在会明白为什么它们是runes而不是单个的int32
。
声明变量的数据类型
现在您已经了解了不同的基本数据类型,我们将介绍如何在go中将这些类型分配给变量。
在Go中,我们可以使用关键字var
定义一个变量,后跟变量名和所需的数据类型。
在下面的例子中,我们将声明一个类型为float64
的名为pi
的变量。
关键字var
是第一个声明的东西:
var pi float64
然后是我们的变量名pi
:
var pi float64
最后是数据类型float64
:
var pi float64
我们也可以指定一个可选的初始值,例如3.14
:
var pi float64 = 3.14
Go是一门静态类型的语言。静态类型意味着程序中的每条语句都会在编译时被检查。这也意味着数据类型绑定到变量,而在动态链接的语言中,数据类型绑定到值。
例如,在Go中,在声明变量时声明类型:
var pi float64 = 3.14
var week int = 7
如果声明方式不同,每个变量都可能是不同的数据类型。
这与PHP等语言不同,PHP的数据类型与值相关:
$s = "sammy"; // $s 自动为字符串类型
$s = 123; // $s 自动为数字类型
在上面的代码块中,第一个$s
是一个字符串,因为它被赋值为"sammy"
,第二个$s
是一个整数,因为它的值为123
。
接下来,让我们看看更复杂的数据类型,如数组。
数组
An array of strings looks like this:
数组是一组有序的元素序列。数组的容量在创建时定义。一旦数组分配了大小,就不能再改变它的大小。因为数组的大小是静态的,这意味着它只分配一次内存。这使得数组的使用有些死板,但提高了程序的性能。因此,优化程序时通常会用到数组。接下来介绍的切片更灵活,在其他语言中构成了你所认为的数组。
数组通过声明数组的大小,然后在花括号{ }
中定义数据类型来定义。
字符串数组如下所示:
[3]string{"blue coral", "staghorn coral", "pillar coral"}
我们可以将数组存储在变量中,并将其打印出来:
coral := [3]string{"blue coral", "staghorn coral", "pillar coral"}
fmt.Println(coral)
Output[blue coral staghorn coral pillar coral
如前所述,切片类似于数组,但要灵活得多。让我们来看看这个可变数据类型。
切片
切片是一个长度可以改变的有序元素序列。切片可以动态地增加它们的大小。当你向切片中添加新项目时,如果切片没有足够的内存来存储新项目,它将根据需要向系统请求更多的内存。因为切片可以在需要时扩展以添加更多元素,所以切片比数组更常用。
切片是通过在左方括号[]
和右方括号{}
之间声明数据类型来定义的。
整数切片如下所示:
[]int{-3, -2, -1, 0, 1, 2, 3}
浮点数的切片如下所示:
[]float64{3.14, 9.23, 111.11, 312.12, 1.05}
字符串切片如下所示:
[]string{"shark", "cuttlefish", "squid", "mantis shrimp"}
让我们将字符串切片定义为seaCreatures
:
seaCreatures := []string{"shark", "cuttlefish", "squid", "mantis shrimp"}
我们可以通过调用这个变量来打印它们:
fmt.Println(seaCreatures)
Output[shark cuttlefish squid mantis shrimp
我们可以使用append
关键字将元素添加到切片中。下面的命令将字符串’ seahorse '添加到切片中:
seaCreatures = append(seaCreatures, "seahorse")
你可以通过打印它来验证它是否被添加了:
fmt.Println(seaCreatures)
Output[shark cuttlefish squid mantis shrimp seahorse
如你所见,如果你需要管理未知大小的元素,切片比数组更通用。
Maps
map是Go内置的哈希或字典类型。map使用键和值作为一对来存储数据。这在编程中很有用,可以通过索引(本例中是键)快速查找值。例如,你可能想保存一个用户映射,按用户ID索引。键是用户ID, user对象是值。map的构造方法是使用关键字map
,后面是方括号[]
中的键数据类型,后面是花括号中的值数据类型和键值对。
map[key]value{}
map通常用于保存相关的数据,例如ID中包含的信息,如下所示:
map[string]string{"name": "Sammy", "animal": "shark", "color": "blue", "location": "ocean"}
您会注意到,除了大括号之外,整个映射中还有冒号。冒号左边的单词是键。在Go中键可以是任何可比较的类型。可比类型是基本类型,如strings
、ints
等。基本类型是由语言定义的,不是由任何其他类型组合而成的。虽然它们可以是用户定义的类型,但保持简单是最佳实践,以避免编程错误。上述字典中的键是:name
、animal
、color
和location
。
冒号右边的单词是值。值可以由任何数据类型组成。上述字典中的值是:Sammy
、shark
、blue
和ocean
。
让我们将map存储在一个变量中并打印出来:
sammy := map[string]string{"name": "Sammy", "animal": "shark", "color": "blue", "location": "ocean"}
fmt.Println(sammy)
Outputmap[animal:shark color:blue location:ocean name:Sammy
如果我们想要分离萨米的颜色,我们可以通过调用sammy ["color"]
来实现。我们把它打印出来:
fmt.Println(sammy["color"])
Outputblue
由于map提供了用于存储数据的键值对,因此它们可以成为Go程序中的重要元素。
总结
此时,您应该更好地了解Go中可供使用的一些主要数据类型。当您使用Go语言开发编程项目时,这些数据类型中的每一种都将变得非常重要。
相关文章:
理解Go中的数据类型
引言 数据类型指定了编写程序时特定变量存储的值的类型。数据类型还决定了可以对数据执行哪些操作。 在本文中,我们将介绍Go的重要数据类型。这不是对数据类型的详尽研究,但将帮助您熟悉Go中可用的选项。理解一些基本的数据类型能让你写出更清晰、性能…...

【人工智能导论】线性回归模型
一、线性回归模型概述 线性回归是利用函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。简单来说,就是试图找到自变量与因变量之间的关系。 二、线性回归案例:房价预测 1、案例分析 问题:现在要预测140平方的房屋的价格&…...

十大常见排序算法详解(附Java代码实现和代码解析)
文章目录 十大排序算法⛅前言🌱1、排序概述🌴2、排序的实现🌵2.1 插入排序🐳2.1.1 直接插入排序算法介绍算法实现 🐳2.1.2 希尔排序算法介绍算法实现 🌵2.2 选择排序🐳2.2.1 选择排序算法介绍算…...

在Ubuntu上通过Portainer部署微服务项目
这篇文章主要记录自己在ubuntu上部署自己的微服务应用的过程,文章中使用了docker、docker-compose和portainer,在部署过程中遇到了不少问题,因为博主也是初学docker-compose,通过这次部署实战确实有所收获,在这篇文章一…...

软件测试基础学习
注意: 各位同学们,今年本人求职目前遇到的情况大体是这样了,开发太卷,学历高的话优势非常的大,公司会根据实际情况考虑是否值得培养(哪怕技术差一点);学历稍微低一些但是技术熟练的…...
移动手机截图,读取图片尺寸
这个代码的设计初衷是为了解决图片处理过程中的一些痛点。想象一下,我们都曾遇到过这样的情况:相机拍摄出来的照片、网络下载的图片,尺寸五花八门,大小不一。而我们又渴望将它们整理成一套拥有统一尺寸的图片,让它们更…...
服务器应用程序不可用的原因是什么引起的
服务器应用程序不可用的原因是什么引起的 服务器应用程序不可用的原因是什么引起的?其实服务器应用程序不可用可能是由多种原因引起的。主要包括软件故障、网络问题、硬件故障、安全问题、配置错误、容量不足、数据库问题等,具体详细服务器应用程序不可用的原因如下…...
使用SPY++查看窗口信息去排查客户端UI软件问题
目录 1、使用SPY++查看窗口的信息 2、使用SPY++查看某些软件UI窗口用什么UI组件实现的...

Flink CDC MySQL同步MySQL错误记录
1、启动 Flink SQL [appuserwhtpjfscpt01 flink-1.17.1]$ bin/sql-client.sh2、新建源表 问题1:Encountered “(” 处理方法:去掉int(11),改为int Flink SQL> CREATE TABLE t_user ( > uid int(11) NOT NULL AUTO_INCREMENT COMME…...

深入了解 Linux 中的 AWK 命令:文本处理的瑞士军刀
简介 在Linux和Unix操作系统中,文本处理是一个常见的任务。AWK命令是一个强大的文本处理工具,专门进行文本截取和分析,它允许你在文本文件中查找、过滤、处理和格式化数据。本文将深入介绍Linux中的AWK命令,让你了解其基本用法和…...
【RuoYi项目分析】网关的AuthFilter完成“认证”,注意是认证而不是权限
文章目录 1. 功能介绍2. AuthFilter的配置3. AuthFilter实现分析4. 资料参考 过滤器的功能是检验经过网关的每一个请求,检查 token 中的信息是否有效。 注意是“认证检查”,而不是“权限” 1. 功能介绍 1、在用户完成登录后,程序会把用户相关…...
excel将文件夹下面的表格文件指定名称的sheet批量导出到指定文件中,并按照文件名保存在新文件的不同sheet中
excel将文件夹下面的表格文件指定名称的sheet批量导出到指定文件中,并按照文件名保存在新文件的不同sheet中 import pandas as pd import ositems os.listdir("./") sheetname"" for item in items:if item.__contains__(xls):dfpd.read_exc…...

IIS管理器无法打开。启动后,在任务栏中有,但是窗口不见了
找到IIS管理器启动程序的所在位置 并在cmd命令行中调用 inetmgr.exe /reset 进行重启 先查看IIS管理器属性,找到其位置 管理员模式打开cmd命令行,并切换到上面的文件夹下运行Inetmgr.exe /reset 运行完成后可以重新看到IIS窗口 原因:由于某…...

使用VBA实现快速模糊查询数据
实例需求:基础数据保存在Database工作表中,如下图所示。 基础数据有37个字段,上图仅展示部分字段内容,下图中黄色字段为需要提取的数据字段。 在Search工作表B1单元格输入查询关键字Title和Genre字段中搜索关键字,包…...
spring boot flowable多人前加签
1、前加签插件 package com.xxx.flowable.cmd;import com.xxx.auth.security.user.SecurityUser; import com.xxx.commons.ApplicationContextHolder; import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; import org.apache.co…...

结构体运算符重载
1.降序 struct Point{int x, y;//重载比较符bool operator < (const Point &a) const{return x > a.x;//当前元素大时,是降序} };2.升序 struct Point{int x, y;//重载比较符 // bool operator < (const Point &a) const{ // return x…...
幽默直观的文档作者注释
注释是程序中非常重要的一部分,在不同的编程语言中,注释的风格和语言描述会有所不同。以下是一些常用的注释风格和语言描述: 直观注释:这种注释使用简洁、明了的语言,帮助读者快速地理解代码。例如,代码中…...

前端开发网站推荐
每个人都会遇见那么一个人,永远无法忘却,也永远不能拥有。 以下是一些可以用来查找和比较前端框架的推荐网站: JavaScript框架比较: 这些网站提供了对不同JavaScript框架和库的详细比较和评估。 JavaScripting: 提供了大量的JavaS…...
【C语言】通讯录管理系统(保姆级教程+内含源码)
C系列文章目录 目录 C系列文章目录 前言 一,模块化编程 二,系统框架构建 1.成员信息的创建 2.菜单实现 3.系统功能声明 三、系统功能实现 1.初始化通讯录 2.增加联系人 3.显示所有联系人 4.根据姓名查找位置 5.删除指定联系人 6.查找指定联…...

python自动解析301、302重定向链接
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 使用模块requests 方式代码如下: import requests url_string"http://******" r requests.head(url_string, streamTrue) print r.h…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...