二、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 = 255a++fmt.Println(a)var b int8 = 127b++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 = 33var b byte = 33fmt.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.mzph.cn/pingmian/58781.shtml

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

相关文章

【Vue3.js】计算属性监视属性的深度解析

🧑‍💼 一名茫茫大海中沉浮的小小程序员🍬 👉 你的一键四连 (关注 点赞收藏评论)是我更新的最大动力❤️! 📑 目录 🔽 前言1️⃣ 计算属性概述2️⃣ 监视属性概述3️⃣ 计算属性与监视属性的对比…

PHP反序列化原生类字符串逃逸框架反序列化利用

PHP反序列化 概念 序列化的原因:为了解决开发中数据传输和数据解析的一个情况(类似于要发送一个椅子快递,不可能整个椅子打包发送,这是非常不方便的,所以就要对椅子进行序列化处理,让椅子分成很多部分在一起打包发送…

CentOS 文件系统扩容与缩容

一、 概述 理解Linux文件系统的管理,需要了解以下的一张图: 一般使用LVM (Logical Volume Manager) 管理磁盘存储,该工具允许用户更灵活地分配和管理存储空间。主要有以下几个概念: PV(Physical Volume,物…

大模型面试题全面总结:每一道都是硬核挑战

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂同学、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天分享…

arcgis坐标系问题

2000数据框的工程只能打开2000坐标系的矢量数据和栅格数据(影像图),如果打开80的数据则会投影错误,出现较大偏差。 解决方案:80数据框打开80数据,2000数据库打开2000数据。

六西格玛项目助力,手术机器人零部件国产化稳中求胜——张驰咨询

项目背景 XR-1000型腔镜手术机器人是某头部手术机器人企业推出的高端手术设备,专注于微创手术领域,具有高度的精确性和稳定性。而XR-1000型机器人使用的部分核心零部件长期依赖进口,特别是高精度电机、关节执行机构和视觉系统等,…

模型拆解(三):EGNet、FMFINet、MJRBM

文章目录 一、EGNet1.1编码器:VGG16的扩展网络 二、EMFINet2.1编码器:三分支并行卷积编码器2.2CFFM:级联特征融合模块2.3Edge Module:突出边缘提取模块2.4Bridge Module:桥接器2.5解码器:深度特征融合解码器…

【传知代码】图像处理解决种子计数方法

文章目录 一、背景及意义介绍研究背景农业考种需求传统计数方法的局限性人工计数仪器设备计数 研究意义提高育种效率提高计数准确性广泛的适用性数据存档与分析便利 二、概述三、材料与数据准备以及方法介绍整体流程图像采集图像预处理形态学操作腐蚀运算开运算 图像二值化种子…

【酒店管理与推荐系统】Python+Django网页界面平台+推荐算法+管理系统网站

一、介绍 酒店管理系统。基于Python开发,前端使用HTML、CSS、BootStrap等技术搭建页面,后端使用Django框架处理用户响应请求,主要功能如下: 分为普通用户和管理员两个角色普通用户:登录、注册、查看房间详情、收藏、…

List 列表基础用法

List 列表基础用法 列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。 列表是写在方括号 [] 之间、用逗号分隔开的元素列表。 和字符串一样,列表…

C#/.NET/.NET Core技术前沿周刊 | 第 11 期(2024年10.21-10.31)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…

redis7学习笔记

文章目录 1. 简介1.1 功能介绍1.1.1 分布式缓存1.1.2 内存存储和持久化(RDBAOF)1.1.3 高可用架构搭配1.1.4 缓存穿透、击穿、雪崩1.1.5 分布式锁1.1.6 队列 1.2 数据类型StringListHashSetZSetGEOHyperLogLogBitmapBitfieldStream 2. 命令2.1 通用命令copydeldumpexistsexpire …

动态规划-回文串系列——516.最长回文子序列

1.题目解析 题目来源:516.最长回文子序列——力扣 测试用例 2.算法原理 1.状态表示 求某段字符的最长回文子序列长度需要知道原来的长度以及判断后续的值是否能与之前的回文子序列构成新的回文子序列,因此一维dp表显然无法满足要求,那么就需…

基于STM32的智能门锁控制系统设计

引言 本项目基于STM32微控制器设计了一个智能门锁控制系统,用户可以通过密码输入或指纹识别来控制门锁的开关。该系统集成了键盘、指纹传感器、舵机等外设,实现了门锁的安全、便捷控制,同时也具备了较强的扩展性。该项目展示了STM32在安防领…

基于 FMEA软件的智能制造质量控制策略_SunFMEA软件

【大家好,我是唐Sun,唐Sun的唐,唐Sun的Sun。一站式数智工厂解决方案服务商】 在智能制造的大背景下,制造业正经历着深刻的变革,质量控制也面临着新的挑战和机遇。FMEA(失效模式与影响分析)作为一…

躺平成长-运营日记-第三天

开源竞争: (自己没有办法完全掌握技术的时候就开源掉,培养出更多的技术依赖,让更多的人完善你的技术,那么这不就是在砸罐子吗?一个行业里面你不去砸罐子,其他人就会砸罐子,你不如先砸…

中文文本分类 pytorch实现

前言 使用pytorch实现了TextCNN,TextRNN,FastText,TextRCNN,BiLSTM_Attention,DPCNN,Transformer,开箱即用。 中文数据集 我从THUCNews:THUCTC: 一个高效的中文文本分类工具中抽取…

JAVA利用方法实现四道题

目录 1.给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回-1 2.计算字符串最后一个单词的长度,单词以空格隔开。(注:字符串末尾不以空格为结尾) 3.如果在将所…

前端三件套(HTML + CSS + JS)

前言: 前端三件套,会用就行 毕竟在后面学习JavaWeb,以及在学习vue的时候也有帮助 前端三件套: HTML 定义网页的结构和内容。CSS 负责网页的样式和布局。JavaScript 添加动态交互和功能。 使用到的工具是Visual Studio Code 即…

Android -- [SelfView] 自定义圆盘指针时钟

Android – [SelfView] 自定义圆盘指针时钟 ps:简约圆盘指针时钟&#xff0c;颜色可调、自由搭配&#xff1b;支持阿拉伯数字、罗马数字刻度显示&#xff1b;效果图 使用&#xff1a; <!-- 自定义属性参考 attrs.xml 文件 --> <com.nepalese.harinetest.player.Virg…