(Go语言)初上手Go?本篇文章帮拿捏Go的数据类型!

news2024/11/13 3:33:42

1. bool 类型

布尔类型:只有 true 和 false 两种值

在Go中,整数 0 不代表 false 值,1也不代表 true 值

  • 即数字无法代替布尔值进行逻辑判断,两者是完全不同的类型

布尔类型占用 1 字节

2. int 整型

Go中为不同位数的整数分配了不同的类型,主要分为无符号整型与有符号整型。

序号类型和描述占用空间表数范围
uint8无符号 8 位整型1字节0~255
uint16无符号 16 位整型2字节0~216-1
uint32无符号 32 位整型4字节0~232-1
uint64无符号 64 位整型8字节0~264-1
int8有符号 8 位整型1字节-128~127
int16有符号 16 位整型2字节-215~215-1
int32有符号 32 位整型4字节-231~231-1
int64有符号 64 位整型8字节-263~263-1
uint无符号整型 至少32位
int整型 至少32位
uintptr等价于无符号64位整型,但是专用于存放指针运算,用于存放死的指针地址。

若出现溢出问题,Goland会帮你自动显示出来

在这里插入图片描述
还有两个数据类型

  • rune 类型,有符号,与int32等价,等价于int32,表示一个Unicode码
  • byte 类型,无符号,与uint8等价,当要存储字符时选用byte
  1. Go 各整数类型分:有符号和无符号,int uint 的大小和系统有关
  2. Go 的整型默认声明为int类型
  3. Go程序中 整型变量 在使用时,遵守保小不保大的原则,即:在保证程序正确运行的情况下,尽量是哟ing占用空间小的数据类型。【如:年龄可以使用uint8类型】
  4. bit:计算机中最小的存储单位,byte:计算机中基本的存储单元
var e = 11
// 如何查看某个变量所占用的字节数,可以使用unsafe包下的Sizeof()方法
fmt.Println(unsafe.Sizeof(e)) // 8 字节,Go默认使用的是int64也就是int类型

3. float 浮点型

IEEE-754浮点数,主要分为单精度浮点数(float32)与双精度浮点数(float64)。

类型类型和描述存储空间表数范围
float32IEEE-754 32位浮点数4字节-3.504E38~3.403E38
float64IEEE-754 64位浮点数8字节-1.798E308~1.798E308

关于浮点数在机器中存放形式的简单说明

  • 浮点数=符号位+指数位+尾数位
  • 尾数部分可能丢失,造成精度损失
func main() {
	var a float32 = -123.0000901 // -123.00009		精度缺失1位
	var b float64 = -123.0000901 // -123.0000901
	fmt.Println(a, b)
}

浮点型的一些小贴士:

  1. Go 浮点类型有固定范围和长度,不受具体OS的影响
  2. Go 浮点类型默认声明位 float64类型
  3. 浮点型常量有很多种表现形式,具体可以看一下浮点型字面量
  4. 通常情况下,也更推荐使用float64而不是float32,因为64比32的精度更高

4. complex 复数

类型描述存储范围
complex12864位实数和虚数8字节
complex6432位实数和虚数4字节
var c complex64 = complex(1, 2)  // 1+2i
var d complex128 = complex(1, 3) // 1+3i
fmt.Println(c, d)
fmt.Println(unsafe.Sizeof(c), unsafe.Sizeof(d))

Go提供了三个内建函数 complex、real 和 imag 来创建和操作复数

  • complex(r, i float64) complex128

complex 函数用于创建一个复数。它接受两个参数,分别是复数的实部和虚部,并返回一个复数。

real 函数用于获取复数的实部。它接受一个复数作为参数,并返回该复数的实部。

imag 函数用于获取复数的虚部。它接受一个复数作为参数,并返回该复数的虚部。

5. char 字符

go语言字符串完全兼容UTF-8

类型描述
byte等价 uint8 可以表达ANSCII字符
rune等价 int32 可以表达Unicode字符
string字符串即字节序列,可以转换为[]byte类型即字节切片

在 Go 中没有专门的字符类型(Java中是char类型),如果要存储耽搁字符(字母),一般使用byte类型来保存

字符串就是一串固定长度的字符链接起来的字符序列。

在传统字符串中,它们是由字符组合形成的字符串。而Go中,字符串的组成是由字节构成的

func main() {
	var a byte = 'a'
	var b int = '你'
	var c string = "测试字符串"
	fmt.Println(a, b, c)
}
  1. 如果字符在ASCII表的,例如[0-1,a-z,A-Z…]这种可以直接保存到byte类型

  2. 但如果字符对应的码值大于255,例如中文。这时就要使用int类型保存了

  3. 如果我们需要安装字符的方式输出,这时我们需要格式化输出可以使用…

    fmt.Printf(“%c”,变量)

5.1 本质

  1. 在Go中,字符型默认都是使用UTF-8格式,在开发时就没有编码和乱码的困扰了
  2. 字符和码值的对应关系是通过字符编码表决定好的,也就是说所有字符本质都是数字码值,它们是可以参与数字运算的。
  3. 字符型 存储到 计算机中,需要将字符对应的码值(整数)找出来
    • 存储:字符》对应码值》二进制》存储
    • 读取:二进制》码值》字符》读取

6. string 字符串

字符串就是一串固定长度的字符连接起来的字符序列,Go的字符串是由单个字节连接起来的。

Go语言的字符串的字节使用UTF-8编码表示Unicode文本

var d = `test another useType`
fmt.Println(d)

使用细节

  1. Go 语言的字符串的字节使用UTF-8编码标识Unicode文本,这样Golang统一使用UTF-8编码,中文乱码问题也就不存在了

  2. 字符串一旦赋值了,就不能再更改了;在Go中,字符串是不可变的。

    为什么go语言中不能通过下标的方式进行修改?

    • 因为go中的字符串的数据结构体是由一个指针和长度组成的结构体,该指针指向的一个切片才是真正的字符串值。
    • go中源码字符串的底层结构:
    type stringStruct struct {
      str unsafe.Pointer // 指向一个[]byte类型的切片指针
      len int // 字符串的长度
    }
    

    因为底层是一个[]byte类型切片,使用下标的方式去修改值,这时候将一个字符内容赋给byte类型,是不允许的。对字符串重新赋值是可以的

    因为go的底层其实是新创建了一个[]byte{}类型的切片,将变量str中的指针指向了新的内存空间地址(hello go)。原来的str存储的值(hello world)内存空间会随着垃圾回收机制被回收掉。

var e string = "不可变!"
e = "可变!" // 重新赋值是可以的
//e[0] = "可变吗?" // 不可以更改字符串
fmt.Println(e)

6.1 字面量

在Go中,字符串本质上是一个不可变的只读的字节数组,也是一片连续的内存空间。

字符串有两种字面量表达方式,分为普通字符串原生字符串

6.1.1 普通字符串

普通字符串由""双引号表示,支持转义,不支持多行书写,下列是一些普通字符串

var a string = "like this!"

6.1.2 原生字符串

原生字符串由反引号表示,不支持转义,支持多行书写,原生字符串里面所有的字符都会原封不动的输出包括换行和缩进。

`这是一个原生字符串....
	它是支持换行的
	在原生字符串中 \t 换行和 \t 缩进 无效
`

6.2 访问

因为字符串本质是字节数组,所以字符串的访问形式跟数组切片完全一致,例如访问字符串第一个元素

str := "this is a string,please check me"
fmt.Println(str[0], len(str)) // 索引下标处的元素是字符的字节,本质是切片所以可以使用len方法

因为本质是切片,所以对于字符串的截取会更加的简单,直接使用切片表达式即可

// 切割字符串
s := string(str[5:16])
fmt.Println(s) // is a string

尽管字符串本质是一个切片数组,但是你不可以由下标来更改字符串中的字符

不过,你可以直接赋值,重新赋值一个新字符串

//str[0] = 's' // 无法通过编译
//str[0] = "s" // 无法通过编译
str = "this is a new string"
fmt.Println(str)

6.3 转换

字符串可以转换为字节切片,而字节切片或字节数组也可以转换为字符串

str := "this is a string"
// 显式类型转换为字节切片
bytes := []byte(str)
fmt.Println(bytes)
// 显式类型转换为字符串
fmt.Println(string(bytes))

虽然字符串中的字符不能够修改,但是切片是可以进行更改的。

所以只需要把字符串转为切片,那么就可以对切片进行更改了。

添加的字符必须是ASCII码,Go是按照ASCII码来比辨认字符的

str := "this is a string"
fmt.Println(&str)
bytes := []byte(str)
// 修改字节切片
bytes = append(bytes, 97, 98, 99)
// 赋值给原字符串
str = string(bytes)
fmt.Println(str) // this is a stringabc

将字符串转换成字节切片以后,两者之间毫无关联,因为Go会新分配一片内存空间给字节切片,再将字符串的内存复制过去,对字节切片进行修改不会对原字符串产生任何影响,这么做是为了内存安全。

6.4 拼接

字符串拼接可以使用+操作符,也可以转换为切片再使用append()方法添加元素

func main() {
   	str := "this is a string"
   	str = str + " that is a int"
   	fmt.Println(str)
   
   	str1 := "this is a string"
   	bytes := []byte(str1)
   	bytes = append(bytes, "that is a int"...)
   	str1 = string(bytes)
   	fmt.Println(str1)
}

不过这两种拼接的性能都很差,如果对性能有更高的要求,建议使用strings.Builder()

// 创建一个字符串构造器
builder := strings.Builder{}
// WriteString方法:在字符串构造器的末尾添加指定字符串
builder.WriteString("this is a string ")
builder.WriteString("that is a int")
fmt.Println(builder.String())

6.5 遍历

Go 中的字符串是一个只读的字节切片,也就是说字符串的组成单位是字节而不是字符。

因此,我们也可以对字符串进行遍历操作

func main() {
	str := "hello world!"
	for i := 0; i < len(str); i++ {
		fmt.Printf("%d,%x,%s\n", str[i], str[i], string(str[i]))
	}
}

7. 默认值(零值)

官方文档中零值称为zero value,零值并不仅仅只是字面上的数字零,而是一个类型的空值或者说默认值更为准确。

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

8. nil

源代码中的nil,可以看出nil仅仅只是一个变量。

var nil Type

Go中的nil并不等同于其他语言的nullnil仅仅只是一些类型的零值,并且不属于任何类型,而nil == nil会返回true

var nil string
println("nil值:", nil) // nil值: 

9. 派生类型

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

10. 😍前篇知识回顾

  1. Go的环境安装与开发工具配置
  2. Go的运行流程步骤与包的概念
  3. (Go)变量与常量?字面量与变量的较量!

11. 💕👉 其他好文推荐

  • 还不了解Git分布式版本控制器?本文将带你全面了解并掌握
  • 带你认识Maven的依赖、继承和聚合都是什么!有什么用?
  • 2-3树思想与红黑树的实现与基本原理
  • !全网最全! ElasticSearch8.7 搭配 SpringDataElasticSearch5.1 的使用
  • 全面深入Java GC!!带你完全了解 GC垃圾回收机制!!
  • 全面了解Java的内存模型(JMM)!详细清晰!
  • 在JVM中,类是如何被加载的呢?本篇文章就带你认识类加载的一套流程!

全文资料学习全部参考于:Golang中文学习文档

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

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

相关文章

用 Python 从零开始创建神经网络(四):激活函数(Activation Functions)

激活函数&#xff08;Activation Functions&#xff09; 引言1. 激活函数的种类a. 阶跃激活功能b. 线性激活函数c. Sigmoid激活函数d. ReLU 激活函数e. more 2. 为什么使用激活函数3. 隐藏层的线性激活4. 一对神经元的 ReLU 激活5. 在隐蔽层中激活 ReLU6. ReLU 激活函数代码7. …

【C++】—掌握STL string类:string的模拟实现

文章目录 &#x1f49e;1.浅拷贝&#x1f49e;2.深拷贝&#x1f49e;3. string类的模拟实现&#x1f49e;3.1 string的构造函数&#x1f49e;3.2 string的析构函数&#x1f49e;3.3 string的拷贝构造&#x1f49e;3.4 string的size&#x1f49e;3.5 string的operator[]&#x1…

元器件篇——自恢复保险丝(PPTC)

1 定义 保险丝&#xff08;Fuse&#xff09;也被称为电流保险丝。根据IEC127标准&#xff0c;将保险丝定义为熔断体。主要的作用就是起过载保护。电路中正确布置保险丝&#xff0c;当保险丝在电流异常升高到一定时&#xff0c;或者热度升高到一定时&#xff0c;自身熔断&#x…

多媒体信息检索

文章目录 一、绪论二、文本检索 (Text Retrieval)(一) 索引1.倒排索引2.TF-IDF (二) 信息检索模型 (IR模型&#xff0c;Information Retrieval)1.布尔模型 (Boolean模型)(1)扩展的布尔模型 (两个词)(2)P-Norm模型 (多个词) 2.向量空间模型 (Vector Space Model&#xff0c;VSM)…

Node.js——fs模块-文件夹操作

1、借助Node.js的能力&#xff0c;我们可以对文件夹进行创建、读取、删除等操作 2、方法 方法 说明 mkdir/mkdirSync 创建文件夹 readdir/readdirSync 读取文件夹 rmdir/rmdirSync 删除文件夹 3、语法 其余的方法语法类似 本文的分享到此结束&#xff0c;欢迎大家评论区…

ABAP:SET CURSOR FIELD设置鼠标焦点

SET CURSOR FIELD <字段名>&#xff1a;设置鼠标焦点到该字段 SET CURSOR 设置到鼠标焦点列还是行 SET CURSOR LINE 设置鼠标焦点到行 GET CURSOR field <字段名> &#xff1a;这个相对应的获取鼠标焦点得到的字段

Gitlab-执行器为Kubetnetes时的注意事项,解决DNS解析问题

一、Gitlab-Runner 这里对于Runner的理解非常重要。 具体执行ci流水线的叫执行器。执行器可以部署是shell、docker、k8s的pod.执行完任务则生命周期结束。 管理执行器的叫Gitlab-Runner。Runner则是与Gitlab Server的Ci agent.(可以简单这么理解) 二、执行器为Kubetnetes时,DN…

双向链表(带头双向循环链表)巨详解!!!

概念 本文讲述的双向链表&#xff0c;全名叫做带头双向循环链表&#xff0c;我们学习的链表总共有八种 在前文讲述单链表时所讲到的单链表&#xff0c;其实就叫做不带头单向不循环链表&#xff0c;这里的带头、不带头才是真正的头结点&#xff0c;前文中的头结点其实叫做首元素…

时序预测 | Python基于CNN-transformer时间序列预测

时序预测 | Python基于CNN-transformer时间序列预测 目录 时序预测 | Python基于CNN-transformer时间序列预测预测效果基本介绍参考资料 预测效果 基本介绍 时序预测 | Python基于CNN-transformer时间序列预测 Cnn-transformer-自适应稀疏自注意力ASSA-对比归一化contranorm预…

网站架构知识之Ansible进阶(day022)

1.handler触发器 应用场景&#xff1a;一般用于分发配置文件时候&#xff0c;如果配置文件有变化&#xff0c;则重启服务&#xff0c;如果没有变化&#xff0c;则不重启服务 案列01&#xff1a;分发nfs配置文件&#xff0c;若文件发生改变则重启服务 2.when判断 用于给ans运…

Yolo11改进策略:上采样改进|CARAFE,轻量级上采样|即插即用|附改进方法+代码

论文介绍 CARAFE模块概述&#xff1a;本文介绍了一种名为CARAFE&#xff08;Content-Aware ReAssembly of FEatures&#xff09;的模块&#xff0c;它是一种用于特征上采样的新方法。应用场景&#xff1a;CARAFE模块旨在改进图像处理和计算机视觉任务中的上采样过程&#xff0…

常用的c++特性-->day02

c11新特性 可调用对象案例分析 可调用对象包装器语法案例可调用对象包装器作为函数参数补充&#xff1a;类型转换运算符案例 可调用对象绑定器语法格式绑定非类成员函数/变量案例1案例2案例3案例4 绑定类成员函数/变量 lambda表达式捕获列表案例1返回值案例2 --> 包装器绑定…

锐捷技能大赛—L2TP隧道与L2TP Over IPSec嵌套,并在隧道内运行OSPF

目录 总部与分支站点之间建立隧道 基础配置 配置L2TP VPN ​编辑配置L2TP Over IPSec L2TP Over IPSec隧道内运行OSPF协议 总部与分支站点之间建立隧道 拓扑如下 基础配置 R1 int g0/1 ip add 10.1.1.1 30 int g0/0 ip add 192.168.10.254 24 exit ip route 0.0.0.0 0.0…

python可视化将多张图整合到一起(画布)

这周有点事忙着&#xff0c;没时间重温刚结束的Mathurcup数学建模&#xff0c;这两天也是再看了下&#xff0c;论文还是赶紧挺烂的&#xff0c;但比国赛又有进步&#xff08;说起国赛又不得不抱怨了&#xff0c;基本其余省份都发了&#xff0c;但江西......哎&#xff09;。哎&…

网络编程、UDP、TCP、三次握手、四次挥手

一、初识网络编程 网络编程的概念&#xff1a;在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景&#xff1a;即时通信、网游对战、金融证券、国际贸易、邮件等等。 不管是什么场景&#xff0c;都是计算机和计算机之间通过网络进行…

在 Jupyter Notebook 中使用 Matplotlib 进行交互式可视化的教程

在 Jupyter Notebook 中使用 Matplotlib 进行交互式可视化的教程 引言 数据可视化是数据分析的重要组成部分&#xff0c;能够帮助我们更直观地理解数据。Matplotlib 是 Python 中最流行的绘图库之一&#xff0c;而 Jupyter Notebook 则是进行数据分析和可视化的理想环境。本文…

[单例模式]

[设计模式] 设计模式是软件工程中的一种常见做法, 它可以理解为"模板", 是针对一些常见的特定场景, 给出的一些比较好的固定的解决方案. 不同语言适用的设计模式是不一样的. 这里我们接下来要谈到的是java中典型的设计模式. 而且由于设计模式比较适合有一定编程经…

STM32软件开发 —— STM32CudeMX使用优点

目 录 STM32CudeMX使用思路步骤详细 STM32CudeMX 在图形化工具STM32CudeMX出现之前&#xff0c;开发者通常是参考库驱动文件中的例程来配置芯片的&#xff0c;进行拷贝和修改等&#xff0c;为了提高开发效率&#xff0c;ST公司开发了STM32CudeMX工具&#xff0c;通过它简化了芯…

江西省补贴性线上职业技能培训管理平台(刷课系统)

江西省补贴性线上职业技能培训管理平台(刷课系统) 目的是为了刷这个网课 此系统有两个版本一个是脚本运行&#xff0c;另外一个是可视化界面运行 可视化运行 技术栈:flask、vue3 原理: 通过分析网站接口&#xff0c;对某些接口加密的参数进行逆向破解&#xff0c;从而修改请求…

Golang | Leetcode Golang题解之第546题移除盒子

题目&#xff1a; 题解&#xff1a; func removeBoxes(boxes []int) int {dp : [100][100][100]int{}var calculatePoints func(boxes []int, l, r, k int) intcalculatePoints func(boxes []int, l, r, k int) int {if l > r {return 0}if dp[l][r][k] 0 {r1, k1 : r, k…