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

news2024/11/7 17:58:04

📅 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语言官方文档获取最准确的信息和最新方法列表。

未经允许禁止转载

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue+element上传图片

一、html页面上传图片 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

22_快速diff算法

目录 处理相同的前置元素和后置元素处理相同的前置元素和后置元素-挂载处理相同的前置元素和后置元素-卸载判断是否需要进行 DOM 移动操作如何移动元素 处理相同的前置元素和后置元素 快速 diff 算法是需要经过预处理的&#xff0c;什么是预处理呢&#xff1f;我们来看一下下面…

Redis-事务、锁

文章目录 数据库的事务、锁介绍数据库的锁数据库的事务 Redis的事务介绍Redis的事务操作例子Redis的锁介绍1. 加锁2. 释放锁乐观锁和悲观锁悲观锁&#xff08;Pessimistic Locking&#xff09;乐观锁&#xff08;Optimistic Locking&#xff09;Redis中的锁机制 3. Redlock算法…

微服务基础拆分实践(第一篇)

目录 前言 一、认识微服务 1.1 单体架构 VS 微服务架构 1.2 微服务的集大成者&#xff1a;SpringCloud 1.3 微服务拆分原则 1.4 微服务拆分方式 二、微服务拆分入门步骤 &#xff1a;以拆分商品模块为例 三、服务注册订阅与远程调用&#xff1a;以拆分购物车为例 3.1 …

【NOIP普及组】 过河卒

【NOIP普及组】 过河卒 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 如图&#xff0c;A 点有一个过河卒&#xff0c;需要走到目标 B 点。卒行走规则&#xff1a;可以向下、或者向右。同时在棋盘上的任一点有一个对方的马&#xff08;如上…

功能强大视频编辑软件 Movavi Video Editor Plus 2024 v24.2.0 中文特别版

Movavi Video Editor Plus中文修改版是一款功能强大的视频制作编辑软件&#xff0c;使用能够帮助用户快速从录制的素材中制作成一个精美的电影&#xff0c;支持进行视频剪辑&#xff0c;支持添加背影、音乐和各种音乐&#xff0c;软件使用简单&#xff0c;无需任何的经验和专业…

linux基本指令之文件操作

前言 这次博客的主要目的就是要解决如何快速查看或查找文件&#xff0c;以及讲解文件的一些属性。本次博客还是以基本指令为主来理解linux对文件的操作。 linux下输入输出流的理解 在linux中&#xff0c;我们要对文件进行输入输出时&#xff0c;一般会怎么做呢? 可以通过pr…

JavaEE初阶---网络原理值TCP篇(三)

文章目录 1.延时应答机制2.捎带应答3.面向字节流---粘包问题3.1问题引入3.2解决方法 4.异常情况的处理5.TCP的心跳机制6.TCP/UDP的对比 1.延时应答机制 例如我们的这个剩余空间大小10kb,如果我们直接返回ack,这个发送方的窗口大小只能是10kb&#xff0c;但是如果我们进行延时&…

慢sql优化和Explain解析

要想程序跑的快&#xff0c;sql优化不可懈怠&#xff01;今日来总结一下常用的慢sql的分析和优化的方法。 1、慢sql的执行分析&#xff1a; 大家都知道分析一个sql语句执行效率的方法是用explain关键词&#xff1a; 举例&#xff1a;sql:select * from test where bussiness_…

Java后端面试内容总结

先讲项目背景&#xff0c;再讲技术栈模块划分&#xff0c; 讲业务的时候可以先讲一般再特殊 为什么用这个&#xff0c;好处是什么&#xff0c;应用场景 Debug发现问题/日志发现问题. QPS TPS 项目单元测试&#xff0c;代码的变更覆盖率达到80%&#xff0c;项目的复用性高…

【10月】新款3DMAX插件排行榜

根据近期的行业动态和插件发布情况&#xff0c;整理并推荐一些在10月或近期内受到关注的3DMAX新款插件。 1. MaxToCAD插件 功能特点&#xff1a;允许用户将3D MAX中的三维模型快速转换为CAD软件可识别的二维平面图&#xff0c;适用于需要将3D设计导出为施工图或平面图的设计师…

【数据结构与算法】第7课—数据结构之队列

文章目录 1. 队列1.1 什么是队列1.2 队列的结构1.3 队列初始化1.4 队列入栈1.5 出队列1.6 查找队列有效元素个数1.7 取队头和队尾数据1.8 销毁链表 2. 用两个队列实现栈3. 用两个栈实现队列4. 循环队列 1. 队列 注&#xff1a;文中Queue是队列&#xff0c;Quene是错误写法 1.1 …

window快捷键:window + v 打开剪切板历史记录 / 非常实用

一、剪切板历史记录功能介绍 1.1、window v 打开剪切板历史记录 / 文字、图片都可记录 1.2、window v 最近使用 1.3、window v 表情符号 1.4、window v GIF 1.5、window v 颜文字 1.6、window v 符号 二、欢迎交流指正

手机功耗异常大数据看板建设

一、背景 基于《软件绿色联盟应用体验标准—功耗标准》监控软硬件资源功耗异常类别与趋势 上述为手机功耗问题的前世今生及我们应该在哪些维度建立功耗的埋点监控支持分析​ 二、目标 手机端侧建立alarm\wakelock\wakeup\gps\bt\cpu\sensor\netTriffic等功耗相关的使用次数和时…

多彩电子显示屏

在仓储管理的广阔舞台上&#xff0c;一款名为“仓库46代”的创新标签悄然登场&#xff0c;它不仅是技术的飞跃&#xff0c;更是智慧仓储的新篇章。这款标签&#xff0c;以其独特的515.6x260x29mm身材&#xff0c;优雅地融入了繁忙的仓库环境&#xff0c;其沉稳的黑色外观&#…

sklearn|机器学习:决策树(一)

文章目录 sklearn&#xff5c;机器学习&#xff1a;决策树&#xff08;一&#xff09;&#xff08;一&#xff09;概述&#xff08;二&#xff09;实战1. 环境配置2. sklearn 中的决策树&#xff08;1&#xff09;模块 sklearn.tree&#xff08;2&#xff09;sklearn 基本建模流…

服务器Linux系统网络重启失败 Restarting network (via systemctl):......

网络重启时报错&#xff1a; Linux 网络服务重启失败可能由网络配置工具冲突或配置错误引起。 冲突问题&#xff1a;在 Linux 中&#xff0c;network 和 NetworkManager 这两个工具可能会冲突&#xff0c;禁用 NetworkManager 可以尝试解决该问题。 先停止服务 systemctl s…

域控操作二十四:主域故障辅域接替

模拟环境&#xff1a;上海DC1故障无法开机&#xff0c;导致只有一个DNS的电脑无法上网&#xff08;实际可以添加DC2但是为了实验就不说了&#xff09; FSMO还在DC1上 使用powershell把角色迁移到DC2 ntdsutil roles connections connect to server DC2SHA.whbk.cn quitSeize …

边缘AI计算技术应用-实训解决方案

一、解决方案架构 1.1 来自产业的项目 实训项目全部是基于产业的商业化项目&#xff0c;经过角色拆解、任务拆解、代码拆解、部署流程拆解等过程&#xff0c;讲其标准化为教师可以带领学生完成的实训内容&#xff0c;真正帮助学生接触产业前沿技术和工作内容&#xff0c;提升就…

贪心算法习题其二【力扣】【算法学习day.18】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…