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

embedded/2024/10/31 5:36:05/

📅 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.ppmy.cn/embedded/133809.html

相关文章

论文笔记:通用世界模型WorldDreamer

整理了WorldDreamer: Towards General World Models for Video Generation via Predicting Masked Tokens 论文的阅读笔记 背景模型实验 背景 现有的世界模型仅限于游戏或驾驶等特定场景,限制了它们捕捉一般世界动态环境复杂性的能力。针对这一挑战,本文…

地平线 3D 目标检测 bev_sparse 参考算法-V1.0

该示例为参考算法,仅作为在 征程 6 上模型部署的设计参考,非量产算法 01 简介 在自动驾驶视觉感知系统中,为了获得环绕车辆范围的感知结果,通常需要融合多摄像头的感知结果。目前更加主流的感知架构则是选择在特征层面进行多摄像…

栈和队列(1)——栈

栈的基本概念 1. 栈的定义:只允许在一端进行插入或删除操作的线性表(可以理解为操作受限的线性表)。 2. 栈的特点:后进先出(LIFO)。 3. 栈的基本操作:初始化、销毁、进栈、出栈、读栈顶元素等…

AListFlutter(手机alist)——一键安装,可在手机/电视上运行并挂载各个网盘

前面提到软路由系统OpenWRT的时候,当时说过可以在OpenWRT里安装alist,然后挂载网盘,这样就可以通过webdav的方式在家庭局域网下的任何设备都可以访问操作这些网盘,摆脱硬盘空间不够的问题。 但alist的官方版本是没有手机版本的&a…

SQLite 语法

SQLite 语法 SQLite 是一种轻量级的数据库管理系统,它遵循 SQL(结构化查询语言)标准。SQLite 的语法相对简单,易于学习和使用。本文将详细介绍 SQLite 的基本语法,包括数据定义语言(DDL)、数据…

Docker | 校园网上docker pull或者docker run失败的一种解决方法

场景 需要从仓库拉取镜像 无论使用命令docker pull 还是 docker run 但是总是显示如下的错误: 解决方法 查看虚拟机网络连接方式 Linux上检查校园网是否登录 有界面 无界面 只是命令行操作的Linux 关于Linux服务器端更新命令apt update没有效果问题总结(校园网认证)

HTML入门教程14:HTML图像

一、图像标签 HTML使用<img>标签来插入图像。<img>标签是一个空标签&#xff0c;即它只包含属性&#xff0c;没有闭合标签。 二、基本语法 <img src"图像路径" alt"替代文本">src属性&#xff1a;指定图像的URL或路径。这是必需的属性…

如何配置,npm install 是从本地安装依赖

在 Node.js 中&#xff0c;要使npm install从本地安装依赖&#xff0c;可以按照以下步骤进行配置&#xff1a; 一、准备本地依赖包 确保你有本地的依赖包。这个依赖包可以是一个包含package.json文件的文件夹&#xff0c;或者是一个已经打包好的.tgz文件。 二、使用相对路径…