二、Go快速入门之数据类型

📅 2024年4月27日

📦 使用版本为1.21.5

Go的数据类型

📖官方文档:https://go.dev/ref/spec#Types

1️⃣ 布尔类型

⭐️ 布尔类型只有,truefalse

⭐️ 在Go中整数0不会代表假,非零整数也不能代替真,也就是数字并不能代替布尔类型在逻辑判断中使用

2️⃣ 整形

⭐️ 在Go中它是有无符号数的,但是在Java中他就没有无符号数的

无符号数和有符号数区别就在于,无符号数不可以表示负数

序号类型和描述
uint8无符号 8 位整型
uint16无符号 16 位整型
uint32无符号 32 位整型
uint64无符号 64 位整型
int8有符号 8 位整型
int16有符号 16 位整型
int32有符号 32 位整型
int64有符号 64 位整型
uint无符号整型 至少32位
int整型 至少32位
uintptr等价于无符号64位整型,但是专用于存放指针运算,用于存放死的指针地址。

⭐️ 它们的取值范围

整数类型有无符号存储大小 (字节)位数表示范围
int8有符号18-128 to 127
uint8无符号180 to 255
int16有符号216-32,768 to 32,767
uint16无符号2160 to 65,535
int32有符号432-2,147,483,648 to 2,147,483,647
uint32无符号4320 to 4,294,967,295
int64有符号864-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
uint64无符号8640 to 18,446,744,073,709,551,615

请注意,intuint 的具体大小未直接列出,因为它们是根据平台而定的,通常分别与 int32int64uint32uint64 相匹配。

⭐️ unit8刚刚好可以用来表示颜色的RGB值(0-255)

⭐️ 如果超出整数限定的范围的最大值,就会发生整数环绕

func main() {
	var a uint8 = 255
	a++
	fmt.Println(a)
	var b int8 = 127
	b++
	fmt.Println(b)
}

//输出
0
-128 
3️⃣ 浮点型

⭐️ IEEE-754浮点数

⭐️ 在GO中没有double这个表示关键字类型而是代替使用float64,单精度则用float32

⭐️ 如果声明变量的时候未声明默认就是float64

类型字节类型和描述
float324IEEE-754 32位浮点数
float648IEEE-754 64位浮点数
4️⃣(1)字符类型

完全兼容UTF-8

⭐️ byteuint8互换使用,runeint32互换使用,就是使用了别名

Printf 几乎和C的printf一模一样

func main() {
	var u uint8 = 33
	var b byte = 33
	fmt.Printf("%c\n", b) //打印出字符 unicode 这个和Java类似
	fmt.Printf("%c\n", u) //打印出字符
	fmt.Printf("%v\n", b)  //打印出数字
	fmt.Printf("%v", b) 
}

//输出
!
!
33
33

⭐️ 任何整数都可以转换成对应的字符(Unicode表上有),但是如果你使用的是rune类型这个,那就表示你的意图就是将他输为一个字符,应该是相当于char

⭐️ 凯撒加密法(Caeser cipher):对于加密信息,一种简单有效的办法就是把每个字母都移动固定长度的位置。

func main() {
	c := 'c'
	c += 3 //往后移动三位
	fmt.Printf("%c", c)
}

⭐️ ROT13:把字母替换成+13后对应的字母

⭐️ 本质上每个runebyte,都是存储的数值类型,也就表示它们之间也可以运算

func main() {
	c := 'c'
	C := 'C'
	c = c - 'a' + 'A' //小写转换大写
	C = C - 'A' + 'a' //大写转换小写
	fmt.Printf("%c\n", c)
	fmt.Printf("%c", C)
}
类型描述
byte等价 uint8 可以表达ANSCII字符
rune等价 int32 可以表达Unicode字符

⭐️ unicode包,包含了一些针对测试用的函数

func main() {
	unicode.IsLetter('1') //判断是否为字母
	unicode.IsDigit('A') //判断是否为数字
	unicode.IsSpace(' ') //判断是否为空格
}

⭐️ 以下是unicode包中常用的方法和使用方法的表格:

方法名用途用法示例
IsLetter判断一个Unicode字符是否为字母unicode.IsLetter('a')
IsDigit判断一个Unicode字符是否为数字unicode.IsDigit('1')
IsUpper判断一个Unicode字符是否为大写字母unicode.IsUpper('A')
IsLower判断一个Unicode字符是否为小写字母unicode.IsLower('a')
IsTitle判断一个Unicode字符是否为标题字符(通常是大写字母)unicode.IsTitle('T')
IsSpace判断一个Unicode字符是否为空白字符unicode.IsSpace(' ')
IsPunct判断一个Unicode字符是否为标点符号unicode.IsPunct('!')
IsSymbol判断一个Unicode字符是否为符号字符unicode.IsSymbol('+')
IsPrint判断一个Unicode字符是否为可打印字符unicode.IsPrint('*')
ToLower将一个Unicode字符转换为小写字母unicode.ToLower('A')
ToUpper将一个Unicode字符转换为大写字母unicode.ToUpper('a')
ToTitle将一个Unicode字符转换为标题形式(通常是大写字母)unicode.ToTitle('t')
ToASCII将一个Unicode字符转换为对应的ASCII字符,如果存在的话unicode.ToASCII('©')
FullRuneName返回一个Unicode字符的完整名称unicode.FullRuneName('❤')
RuneCountInString返回字符串中特定Unicode字符的数量unicode.RuneCountInString("hello", 'l')
4️⃣(2)字符串

⭐️ 可以赋予给不同变量不同的string值,但是string本身并不可变

⭐️ 字符串可以为空,但不会是nil

⭐️ 在go中默认string是一个[8]byte的一个集合,和Java一样可以通过下标来访问String的字符,但是不能通过下标修改,因为字符串不支持取地址

func main() {
	s := "ABCD"
	fmt.Printf("%c", s[1])//输出B
}

⭐️ 和java/python一样,两个字符串可以用+号拼接,或者使用+=,但是这并不是最有效的办法(后面会学到的)

⭐️ 双引号和与反单引号区别: 双引号需要对特殊字符进行转义,而反单引号则不需要

func main() {
    //两个输出都是一样
	s1:="Hi,\nthis is \"RainBowMango\"."
	s2:=`Hi,
this is "RainBowMango".`
	fmt.Println(s1)
	fmt.Println(s2)
}

⭐️ 字符串可以拼接比如a:='a'+b' 但是会触发内存分配和拷贝,单行语句拼接多个只触发一次,先计算最终字符串长度在分配内存

⭐️ string[]byte之间可以转换,但是触发内存拷贝,会有一定的开销

5️⃣ 复数
类型描述
complex12864位实数和虚数
complex6432位实数和虚数
6️⃣ 其他类型
类型例子
数组[5]int,长度为5的整型数组
切片[]float64,64位浮点数切片
映射表map[string]int,键为字符串类型,值为整型的映射表
结构体type Gopher struct{},Gopher结构体
指针*int,一个整型指针。
函数type f func(),一个没有参数,没有返回值的函数类型
接口type Gopher interface{},Gopher接口
通道chan int,整型通道
7️⃣ 零值

⭐️ 当你声明变量,但是不对他初始化,那么它的值默认就是零值zero value,当然他不是字面上说的数字0,是声明类型的空值或者是默认值

⭐️ nil仅仅只是一个变量,下面是源码体现

Go中的nil并不等同于其他语言的nullnil仅仅只是一些类型的零值,并且不属于任何类型,所以nil == nil这样的语句是无法通过编译的

var nil Type
类型零值
数字类型0
布尔类型false
字符串类型""
数组固定长度的对应类型的零值集合
结构体内部字段都是零值的结构体
切片,映射表,函数,接口,通道,指针nil
8️⃣ 类型转换

⭐️ Go语言没有自动类型提升或者自动你类型转换

image-20240428112601852

9️⃣ 拓展:
⭐️ strings包

⭐️ 在Go中可以使用sttings包来对字符串进行预处理

方法名功能描述使用示例
Compare(a, b string)按照字典顺序比较两个字符串,返回负数、0或正数表示a小于、等于或大于b。result := strings.Compare("abc", "def")
Contains(s, substr string)判断字符串s是否包含子串substr,是则返回true。hasSub := strings.Contains("hello world", "world")
ContainsAny(s, chars string)判断字符串s是否包含chars中的任意一个字符,是则返回true。hasAny := strings.ContainsAny("hello", "xyz")
ContainsRune(s, r rune)判断字符串s是否包含指定的Unicode码位r,是则返回true。hasRune := strings.ContainsRune("hello", 'e')
Count(s, sep string)计算字符串sep在s中出现的非重叠次数,如果sep为空字符串,则返回s的长度加1。count := strings.Count("hello hello", " ")
EqualFold(s, t string)比较两个字符串忽略大小写,相等返回true。equal := strings.EqualFold("Go", "go")
Fields(s string)根据空白字符分割字符串s为[]string,比Split更方便处理英文文本。words := strings.Fields("one two three")
HasPrefix(s, prefix string)判断字符串s是否以前缀prefix开始,是则返回true。hasPrefix := strings.HasPrefix("golang", "go")
HasSuffix(s, suffix string)判断字符串s是否以后缀suffix结束,是则返回true。hasSuffix := strings.HasSuffix("golang", "lang")
Index(s, sep string)返回sep在s中第一次出现的位置索引,未找到返回-1。index := strings.Index("hello world", "world")
Join(a []string, sep string)使用sep连接字符串切片a中的元素形成一个新的字符串。joined := strings.Join([]string{"hello", "world"}, " ")
Repeat(s string, count int)将字符串s重复count次后返回新的字符串。repeated := strings.Repeat("go", 3)
Replace(s, old, new string, n int)将s中的前n个old子串替换为new,n为-1则全部替换。replaced := strings.Replace("banana", "a", "o", -1)
Split(s, sep string)使用sep作为分隔符将s分割成[]string,不包括sep本身,sep为空时按Unicode字符分割。parts := strings.Split("a,b,c", ",")
ToLower(s string)将字符串s转换为小写形式。lower := strings.ToLower("GO")
ToUpper(s string)将字符串s转换为大写形式。upper := strings.ToUpper("go")
// 以下代码演示了strings包中几个常用函数的使用方法,
// 包括检查字符串前缀、后缀,查找子串位置,替换子串,以及统计字符出现次数。

	str := "AAAAAbc" // 定义一个字符串变量

	// 检查字符串是否以指定前缀开始
	fmt.Printf("%t\n", strings.HasPrefix(str, "A"))

	// 检查字符串是否以指定后缀结束
	fmt.Printf("%t\n", strings.HasSuffix(str, "c"))

	// 查找指定子串第一次出现的位置
	fmt.Printf("%d\n", strings.Index(str, "b"))

	// 查找指定子串最后一次出现的位置
	fmt.Printf("%t\n", strings.LastIndex(str, "bc"))

	// 查找指定字符第一次出现的位置
	fmt.Printf("%d\n", strings.IndexRune(str, 'b'))

	// 将字符串中第一个指定的子串替换为另一个子串
	fmt.Printf("%s\n", strings.Replace(str, "b", "B", 1))

	// 统计字符串中指定字符出现的次数
	fmt.Printf("%d\n", strings.Count(str,"A"))
// 以下代码演示了strings包中几个常用函数的使用方法,
// 包括检查字符串前缀、后缀,查找子串位置,替换子串,以及统计字符出现次数。

	str := "AAAAAbc" // 定义一个字符串变量

	// 检查字符串是否以指定前缀开始
	fmt.Printf("%t\n", strings.HasPrefix(str, "A"))

	// 检查字符串是否以指定后缀结束
	fmt.Printf("%t\n", strings.HasSuffix(str, "c"))

	// 查找指定子串第一次出现的位置
	fmt.Printf("%d\n", strings.Index(str, "b"))

	// 查找指定子串最后一次出现的位置
	fmt.Printf("%t\n", strings.LastIndex(str, "bc"))

	// 查找指定字符第一次出现的位置
	fmt.Printf("%d\n", strings.IndexRune(str, 'b'))

	// 将字符串中第一个指定的子串替换为另一个子串
	fmt.Printf("%s\n", strings.Replace(str, "b", "B", 1))

	// 统计字符串中指定字符出现的次数
	fmt.Printf("%d\n", strings.Count(str,"A"))

⭐️ strconv包

💡 字符串的相关类型转换都是通过strcon包实现

当然,下面是Go语言strconv包中一些常用方法的概览,包括它们的功能描述和简单的使用示例。为了清晰展示,我采用Markdown格式列出:

方法名功能描述使用示例
Atoi(s string) (int, error)将字符串s转换为整数(int类型),s应代表一个有符号的十进制整数。num, err := strconv.Atoi("123")
Itoa(i int) string将整数i转换为表示该整数的字符串。str := strconv.Itoa(123)
ParseInt(s string, base int, bitSize int) (i int64, err error)解析一个表示整数的字符串并返回其值和错误。base指定了数字的基数(2到36),bitSize指定了整数类型。num, err := strconv.ParseInt("123", 10, 64)
ParseUint(s string, base int, bitSize int) (uint64, error)ParseInt类似,但用于无符号整数。num, err := strconv.ParseUint("123", 10, 64)
FormatInt(i int64, base int) string将整数i格式化为给定基数(base,2到36)的字符串表示。str := strconv.FormatInt(123, 10)
FormatUint(i uint64, base int) stringFormatInt类似,但用于无符号整数。str := strconv.FormatUint(123, 10)
ParseBool(str string) (value bool, err error)解析一个表示布尔值的字符串并返回其布尔值。有效值为"1", “t”, “T”, “true”, “TRUE”, “True” 或 “0”, “f”, “F”, “false”, “FALSE”, “False”。boolValue, err := strconv.ParseBool("true")
AppendQuote(dst []byte, s string) []byte将带有引号的s追加到dst,并对内部引号进行转义,返回修改后的dst。buf := make([]byte, 0)
result := strconv.AppendQuote(buf, "He said, \"Hello\"!")
AppendQuoteRune(dst []byte, r rune) []byte类似于AppendQuote,但用于单个rune字符。buf := make([]byte, 0)
result := strconv.AppendQuoteRune(buf, '"')

这些只是strconv包中的一部分方法,实际包中还包含了更多用于处理不同数值和类型转换的功能。在实际使用时,请根据需要查阅Go语言官方文档获取最准确的信息和最新方法列表。

未经允许禁止转载

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

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

相关文章

Springboot整合原生ES依赖

前言 Springboot整合依赖大概有三种方式: es原生依赖:elasticsearch-rest-high-level-clientSpring Data ElasticsearchEasy-es 三者的区别 1. Elasticsearch Rest High Level Client 简介: 这是官方提供的 Elasticsearch 客户端,支持…

Spark,Anconda在虚拟机实现本地模式部署

如果想要了解模式的概念部分,以及作用请看: Spark学习-CSDN博客 一.在虚拟机安装spark cd /opt/modules 把Anconda和Spark安装包拖拽进去: 解压: tar -zxf spark-3.1.2-bin-hadoop3.2.tgz -C /opt/installs 重命名&#x…

Javaee:阻塞队列和生产者消费者模型

文章目录 什么是阻塞队列java中的主要阻塞队列生产者消费者模型阻塞队列发挥的作用解耦合削峰填谷 模拟实现阻塞队列put方法take方法生产者消费者模型 什么是阻塞队列 阻塞队列是一种支持阻塞操作的队列,在多线程中实现通线程之间的通信协调的特殊队列 java中的主…

[网络协议篇] UDP协议

文章目录 1. 简介2. 特点3. UDP数据报结构4. 基于UDP的应用层协议5. UDP安全性问题6. 使用udp传输数据的系统就一定不可靠吗?7. 基于UDP的主机探活 python实现 1. 简介 User Datagram Protocol,用户数据报协议,基于IP协议提供面向无连接的网…

使用 three.js 渲染个blender模型

首先需要一个扫描模型,工业上有专门的设备去采集模型的面然后通过建模软件去处理外表面贴图 我们这里取了一个ford汽车的发动机模型 为了让three.js能够使用,使用blender把模型保存为glb格式 为了让页面加载glb模型更快,需要对模型文件进行压…

jade 0919 | 提取自TVBox的直播盒子,频道丰富高清

jade电视直播app覆盖央视全频道和各大卫视,各地地方台也能一网打尽,随时随地看高清电视。各卫视台覆盖广泛,包括浙江电视台、湖南卫视、江苏卫视、东方卫视等全部卫视台,最新内容先一步掌握。拥有广东、北京、风云足球等热播体育频…

Oracle视频基础1.3.2练习

1.3.2 看 Oracle 实例是否启动 ps -ef | grep oracle备份已有的数据库文件到 old 文件夹,用 sample pfile 手动创建新的数据库文件 pfile mkdir old,mv * old,ls,cd old,cp init.ora …/initwilson.ora编辑 pfile,修改 db_name,db_block_siz…

“中信同业+”焕新升级 锚定数字金融新主线,做实金融“五篇大文章”

9月20日,“中信同业”升级发布会及生物多样性债券指数发布在京顺利举办,此次活动以“做强数字金融 服务实体经济”为主题,由中信金控指导,中信银行主办,中信各金融子公司联合承办。来自银行、证券、保险、基金等行业百…

重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer 1. 什么是响应式编程?2. Project Reactor 概述3. HttpHandler概述3.1 HttpHandler是什么3.2 Http…

全桥PFC电路及MATLAB仿真

一、PFC电路原理概述 PFC全称“Power Factor Correction”(功率因数校正),PFC电路即能对功率因数进行校正,或者说是能提高功率因数的电路。是开关电源中很常见的电路。功率因数是用来描述电力系统中有功功率(实际使用…

【音视频 | ADPCM】音频编码ADPCM详细介绍及例子

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

python读取视频并转换成gif图片

1. 安装三方库 moviepy 将视频转换成gif,需要使用 moviepy库 确保已经安装了moviepy库 pip install moviepy2. 代码实现: from moviepy.editor import VideoFileClipmyclip VideoFileClip("video.mp4") myclip2 myclip.subclip(0, 10).re…

人工智能原理实验二:搜索方法

一、实验目的 本实验课程是计算机、智能、物联网等专业学生的一门专业课程,通过实验,帮助学生更好地掌握人工智能相关概念、技术、原理、应用等;通过实验提高学生编写实验报告、总结实验结果的能力;使学生对智能程序、智能算法等…

在Centos7.9服务器上使用LVM方式挂载磁盘以及Windows磁盘性能测试与Linux磁盘性能测试命令hdparm详细

一、在Centos7.9服务器上使用LVM方式挂载磁盘 在磁盘分区挂载之前,先使用lsblk命令查看磁盘信息,未分区挂载的磁盘sdb只有disk类型没有part类型。40G的硬盘sda已经分了两个区sda1、sda2。而sdb磁盘下并没有分区信息,说明还没有分区。磁盘分区…

dicom基础:乳腺影像方位信息介绍

目录 一、轴位 (CC, Craniocaudal) 二、侧位 (Lateral) 三、侧斜位 (MLO, Mediolateral Oblique) 四、不同的拍摄方位的乳腺影像展示 1、RCC(Right Craniocaudal) 2、LCC(Left Craniocaudal) 3、RMLO(Right Medio…

uniapp 报错Invalid Host header

前言 在本地使用 nginx 反向代理 uniapp 时,出现错误 Invalid Host header 错误原因 因项目对 hostname 进行检查,发现 hostname 不是预期的,所以,报错 Invalid Host header 。 解决办法 这样做是处于安全考虑。但&#xff0…

10个领先的增强现实平台【AR】

增强现实 (AR) 被描述为一种通过计算机生成的内容增强现实世界的交互式体验。 使用软件、应用程序和硬件(例如 AR 眼镜),AR 能够将数字内容叠加到现实环境和物体上。早在 2024 年,许多像 Apple 这样的公司就已进入 VR/AR 市场&am…

匹配——rabin_karp是怎么滚动的?

滚动散列函数 接前面用例公式滚动last_pos第三行第二行第一行证明后话接前面 匹配——散列法里面只说前一个字符乘以128再对72057594037927931求模,答案乘以128加后一个字符再对72057594037927931求模。对应代码: hash_s = (DOMAIN * hash_s + ord(s[i])) % PRIME用例 还是…

国产数据库之Vastbase海量数据库 G100

海量数据库Vastbase是基于openGauss内核开发的企业级关系型数据库。其语法和Oracle数据库很像,基本是从Oracle数据库迁移到海量数据库,以下简单介绍入门的使用 1、建库操作 地址:x.x.x.x root/Qa2021 安装路径:/home/vastbase 创…

进程、孤儿进程、僵尸进程、fork、wait简介

进程相关概念 程序和进程 程序:是指编译好的二进制文件,在磁盘上,占用磁盘空间, 是一个静态的概念. 进程:一个启动的程序, 进程占用的是系统资源,如:物理内存,CPU,终端等…