go语言之基本数据类型

文章目录

  • 基础数据类型分类
    • 整数类型
      • 有符号整数
      • 无符号整数
      • 默认整数类型
    • 浮点类型
    • 复数类型
    • 布尔类型
    • 字符类型
    • 字符串
      • replace字符串
      • 获取字符串长度
      • 字符串的拼接
      • 字符串获取指定位置字符
      • 更多string操作
  • 数据类型之间的转换
    • 其它基本类型转字符串类型
      • fmt包中的Sprintf
      • strconv包中函数
    • 字符串类型转其它基础类型
      • strconv包中函数
  • 总结

基础数据类型分类

整数类型

go语言提供了无符号和有符号的整数类型

有符号整数

有符号就是整数有正负之分

类型字节数数值范围
int81-128~127
int162-2^15 ~2^15-1(-32678-32677)
int324-2^31 ~2^31-1(-2147483648-2147483647)
int648-2^63 ~2^63-1
package mainimport ("fmt""unsafe"
)func main() {var a int8 = 1var b int16 = 128var c int32 = 32678var d int64 = 2147483648fmt.Printf("a=%v,类型%T,a占字节%d\n", a, a, unsafe.Sizeof(a))fmt.Printf("b=%v,类型%T,b占字节%d\n", b, b, unsafe.Sizeof(b))fmt.Printf("c=%v,类型%T,c占字节%d\n", c, c, unsafe.Sizeof(c))fmt.Printf("d=%v,类型%T,d占字节%d\n", d, d, unsafe.Sizeof(d))
}输出结果:
a=1,类型int8,a占字节1
b=128,类型int16,b占字节2
c=32678,类型int32,c占字节4
d=2147483648,类型int64,d占字节8

fmt.Printf中%d格式表示输出数字,%v表述输出变量的原始值, %T格式表示输出变量的数据类型,更多fmt.Printf输出写法可以参考go官方文档【https://pkg.go.dev/fmt】

我们在定义一个整型值时,要估摸这个整型值的范围,再来确定使用哪个int的类型。因为int类型赋值不当就会出现如下错误

package mainimport ("fmt""unsafe"
)func main() {var a int8 = 128
}输出结果:
constant 128 overflows int8

无符号整数

无符号整数类型就是没有负数之说只有整正数(没有符号位)
无符号整数范围:0-2^n-1

类型字节数数值范围
int810~255
int1620~2^16-1
int3240~2^32-1
int6480~2^64-1

无符号整数类型在有符号整数类型int的前面多了一个u,这就是表示无符号的意思,值得注意的是,其占用储存空间的字节大小没有变化,但表数范围变了,没有负数了,最大值更大了,这就是无符号整型特点。若实际应用场景某变量中无负数,比如年龄或者身高,可以使用uint来表示

默认整数类型

若直接使用int或者uint,它们占用字节大小是由计算机系统的位数来决定的

类型是否有符号字节数数值范围
int系统32位占4节,系统64位占8节-231-1~231-1或者-263-1~263-1
uint系统32位占4节,系统64位占8节0~232-1或者0~264-1

若不指定数据类型,直接赋值给一个变量,默认类型是int;所以我们在写代码时要有意识的确定具体的数据类型,否则它有可能只需要占用1个字节,但由于编写不规范,导致变量占用4或者8字节,浪费内存空间

package mainimport "fmt"func main() {var a = 9fmt.Printf("%T", a)
}
输出结果
int

浮点类型

支持32位和64位的浮点数
32位浮点数表示的数值范围是1.4e-45到3.4e38
64位浮点数表示的数值范围是4.9e-324到1.8e308

若是想支持显示几位小数,可以使用以下方式

package mainimport "fmt"func main() {f := 3.2//%.2f表示保留两位小数;.0没有小数位;默认是6位小数fmt.Printf("%.2f", f)
}

浮点数在声明的时候可以只写小数位或者整数位


func main() {f1 := 3.f2 := .12fmt.Printf("%.2f,%.2f", f1, f2)
}输出:3.00,0.12

通常使用float64位类型,因为float32的累计计算误差容易扩散,并且float32能表示的正整数并不是很大,以下方式执行结果为true

package main
import "fmt"func testF() {var f float32 = 1 << 24fmt.Println(f == f+1)
}
func main() {testF()
}输出结果为true

若用float64表示,则结果为false;

package main
import "fmt"func testF() {var f float64 = 1 << 24fmt.Println(f == f+1)
}
func main() {testF()
}输出结果为false

很小或很大的数最好用科学计数法书写,通过e或者E来指定指数部分

package mainimport "fmt"func main() {f1 := 3.23456789e10f2 := 1e-10fmt.Printf("%.2f,%.10f", f1, f2)
}

复数类型

在Go语言中complex有两种类型,complex64和complex128。complex64中实部和虚部是32位的,在complex128中实部和虚部是64位的。

package mainimport ("fmt""math""math/cmplx""unsafe"
)var aa complex64
var bb complex128func main() {aa = 5fmt.Printf("%d,%v\n", unsafe.Sizeof(aa), aa)fmt.Printf("%d,%v\n", unsafe.Sizeof(bb), bb)//欧拉公式fmt.Println(cmplx.Exp(1i*math.Pi) + 1)
}

布尔类型

go语言中表达布尔类型使用bool,布尔型的值只可以是常量 true 或者 false
布尔类型占一个字节
布尔类型适于逻辑运算,一般用于程序流程控制。


package mainimport ("fmt""unsafe"
)func main() {flag := 1 == 2//打印结果fmt.Printf("%v\n", flag)//输出占用的字节fmt.Println(unsafe.Sizeof(flag))}输出:
false
1

字符类型

字符表示使用byte或者rune,byte相当于unit8别名;rune相当于int32别名;

package mainimport "fmt"func main() {var ch byte = 'a' //byte相当于uint8,一个字符,1个字节,8位var cha rune = 'a'     //rune 相当于int32别名%v打印出a的ascii的id,%c打印出字符,%T打出对应动态类型fmt.Printf("%T,%v,%c\n", ch, ch, ch)fmt.Printf("%T,%v,%c\n", cha, cha, cha)
}输出:
uint8,97,a
int32,97,a

字符串

字符串类型用 string 来定义。
字符串定义后就不能改变了(单指字符串,变量的值可以变)
字符串可以拼接
当一个字符串里面有转义的时候最好用 `` (Esc下面的按键)括起来(当然转义字符也可以)

golang语言中string是不可变,简单的赋值操作其实内部新建了一个新的对象,新对象的指针指向了新的值
至于为什么这么做,类比与Java的String设计原理
这种设计有几个原因:

  1. 效率:字符串不可变性使得字符串的拼接、截取、替换等操作更加高效。因为无需每次操作都重新分配内存,而是可以共享底层的内存空间。
  2. 并发安全:字符串的不可变性使得多个string操作可以同时读取同一个字符串,而无需加锁或同步机制。
  3. 可靠性:字符串的不可变性可以避免由于修改字符串内容而导致的意外变化,确保了字符串的一致性

介绍几种字符串的常见操作

replace字符串

package mainimport ("fmt""strings"
)func main() {sOld := "hello,码神之路java教程"subString := "java"repString := "go"replace := strings.Replace(sOld, subString, repString, len(subString))fmt.Printf("%s\n", replace)
}
输出结果:
hello,码神之路go教程

获取字符串长度

在utf8编码方式中,1个英文或者符号占用1个字节,中文占用3个字节。len()获取占用的字节长度


package mainimport ("fmt""unicode/utf8"
)var name string
func main()  {name = "hello,你好"//字节长度fmt.Printf("字节长度->%d\n", len(name))//字符个数fmt.Printf("字符个数->%d\n", utf8.RuneCountInString(name))
}输出:
字节长度->12
字符个数->8

字符串的拼接

通过+号直接拼接,不过效率不高;通过bytes.Buffer进行拼接,性能高,参考Java中string和stringBuidler的区分去理解


package mainimport ("bytes""fmt"
)func main()  {//字符串拼接1.+var s = "hello"var s1 = s + ",你好"fmt.Printf("%s\n", s1)//字符串拼接2.bytes.Buffer,性能高,参考javavar sBuilder bytes.BuffersBuilder.WriteString(s)sBuilder.WriteString(",你好")fmt.Printf("%s", sBuilder.String())
}

字符串获取指定位置字符

指定位置的字符要区分字符串中中是否有中文,若有中文,不能直接通过下标去获取;可以通过显示转换为rune数组,然后通过下标获取

package mainimport ("fmt"
)func main()  {//默认使用ascii字符集,128个字符,包含英文,数字,标点符号sF := "hello"//中文默认会使用unicode编码,一个中文占用3个字节sFR := "你好"//英文获取第一个特定字符直接获取第一个字符即可fmt.Printf("%c\n", sF[0])//中文获取第一个特定字符只能转成rune字符数组,然后取第一个fmt.Printf("%s\n", string([]rune(sFR)[0]))
}输出:
h
你

更多string操作

参考:https://pkg.go.dev/strings
参考:https://pkg.go.dev/unicode/utf8
参考:https://pkg.go.dev/strconv

数据类型之间的转换

其它基本类型转字符串类型

fmt包中的Sprintf

“%参数”, 要转换的变量(注意:原先的变量值不变,只是将面值赋给一个string类型的变量
更多操作参考go官方文档:https://pkg.go.dev/fmt

package mainimport ("fmt"
)func main() {var aInt int = 19var bFloat float32 = 4.78var cBool bool = falsevar dByte byte = 'a'var aStr string = fmt.Sprintf("%d",aInt)fmt.Printf("aStr对应的类型是:%T ,s1 = %q \n",aStr, aStr)var bStr string = fmt.Sprintf("%f",bFloat)fmt.Printf("bStr对应的类型是:%T ,s2 = %q \n",bStr, bStr)var cStr string = fmt.Sprintf("%t",cBool)fmt.Printf("cStr对应的类型是:%T ,s3 = %q \n",cStr, cStr)var dStr string = fmt.Sprintf("%c",dByte)fmt.Printf("dStr对应的类型是:%T ,s4 = %q \n",dStr, dStr)
}输出结果:
aStr对应的类型是:string ,s1 = "19" 
bStr对应的类型是:string ,s2 = "4.780000" 
cStr对应的类型是:string ,s3 = "false" 
dStr对应的类型是:string ,s4 = "a" 

strconv包中函数

更多操作参考go官方文档:https://pkg.go.dev/strconv

package mainimport ("fmt""strconv"
)func main() {i := 123//等同于FormatInt(int64(i), 10)iStr := strconv.Itoa(i)fmt.Printf("整数转字符串:%T,%v\n", iStr, iStr)f := 3.1415926fStr := strconv.FormatFloat(f, 'f',2,64)fmt.Printf("浮点数转字符串:%T,%v\n", fStr, fStr)b := truebStr := strconv.FormatBool(b)fmt.Printf("布尔数转字符串:%T,%v\n", bStr, bStr)
}输出结果
整数转字符串:string,123
浮点数转字符串:string,3.14
布尔数转字符串:string,true

字符串类型转其它基础类型

strconv包中函数

package mainimport ("fmt""strconv"
)func main() {i := "123"//等同于FormatInt(int64(i), 10)iInt, _ := strconv.Atoi(i)fmt.Printf("字符串转整型:%T,%v\n", iInt, iInt)f := "3.1415926"fFloat, _ := strconv.ParseFloat(f, 64)fmt.Printf("字符串转浮点数:%T,%v\n", fFloat, fFloat)b := "true"bBool, _ := strconv.ParseBool(b)fmt.Printf("字符串转布尔数:%T,%v\n", bBool, bBool)}

总结

基本数据类型包含6种,分别是整数类型,浮点类型,复数类型,字节类型,字符串类型,布尔类型
在这里插入图片描述

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

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

相关文章

开源与闭源:AI模型发展的双重路径之争

前言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI模型的应用已经渗透到各行各业&#xff0c;从医疗、金融到制造、教育&#xff0c;无不受到AI技术的深刻影响。在讨论一个AI模型“好不好”“有没有发展”时&#xff0c;绕不过“开源”和“闭源”两条…

java 解决异常 Class path contains multiple SLF4J bindings

前面 为了使用 j2cache pom中导入了 <dependency><groupId>net.oschina.j2cache</groupId><artifactId>j2cache-core</artifactId><version>2.8.4-release</version> </dependency><dependency><groupId>net.osc…

2020 年 12 月青少年软编等考 C 语言二级真题解析

目录 T1. 数组指定部分逆序重放思路分析 T2. 简单密码思路分析 T3. 错误探测思路分析 T4. 奇数单增序列思路分析 T5. 话题焦点人物思路分析 T1. 数组指定部分逆序重放 将一个数组中的前 k k k 项按逆序重新存放。例如&#xff0c;将数组 8 , 6 , 5 , 4 , 1 8,6,5,4,1 8,6,5,…

Java开发之JDBC

JDBC 介绍JDBC程序&#xff08;Statement&#xff09;相关细节URLResultSet 连接池程序&#xff08;PreparedStatement&#xff09; 本文主要记录一下学习JDBC的一些知识点 介绍JDBC 首先谈谈什么是JDBC。下面放几张图&#xff0c;大致就可以清楚JDBC了。程序&#xff08;Sta…

网络编程—— Http的Get请求

http: hyper text transport protocal:超文本传输协议。 http是一种基于客户端-服务器模式的协议(Client-Server)。它规定只能由客户端先发起请求给服务器&#xff0c; 服务器做出响应。 http数据传输以数据报文的形式进行&#xff0c; 客户端向服务器发起的请求叫做请求报文。…

HunyuanDiT

1、依赖关系和安装 首先克隆存储库&#xff1a; git clone https://github.com/tencent/HunyuanDiT cd HunyuanDiT unzip HunyuanDiT-main.zip 2、一个environment.yml用于设置 Conda 环境的文件一个environment.yml用于设置 Conda 环境的文件 conda create -n hunyuandit py…

centos7 redis开机启动

[rootlocalhost system]# vim /etc/systemd/system/redis.service 版本是5.0 /usr/local/redis 是redis安装目录 [Unit] DescriptionRedis.server # 指定服务所依赖的其他单元&#xff08;如网络服务&#xff09;。这确保在启动该服务之前&#xff0c;所需的其他单元已经启动…

C++语法|虚函数与多态详细讲解(七)|理解抽象类?(面试向)

系列汇总讲解&#xff0c;请移步&#xff1a; C语法&#xff5c;虚函数与多态详细讲解系列&#xff08;包含多重继承内容&#xff09; 主要是两个问题&#xff1a; 抽象类和普通类有什么区别&#xff1f;一般把什么类处理处理成抽象类 在这里&#xff0c;案例我们仍然沿用上篇…

【Linux玩物志】Linux环境开发基本工具使用(终章) ——git与gdb调试器

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a;这是最后一篇Linux工具篇&#xff0c;今天这篇文章我们要来简单讲一件git与调试器gdb。 目录 使用 git 命令行 安装 git 在 Github 创建项目 注册账号 创建项目 ​编辑 下载项目到本地 在 Gite…

leetcode397周赛场

第一题&#xff1a;两个字符串的排列差 给你两个字符串 s 和 t&#xff0c;每个字符串中的字符都不重复&#xff0c;且 t 是 s 的一个排列。 排列差 定义为 s 和 t 中每个字符在两个字符串中位置的绝对差值之和。 返回 s 和 t 之间的 排列差 。 示例 1&#xff1a; 输入&am…

解决push时,报错error_ failed to push some refs to ‘https___gitee.com_...‘

remote: error: File: 90c5365492dea3b3c855b2375f1de8588ac1bda4 162.65 MB, exceeds 100.00 MB. 原因是上传的文件超过100.00 MB Gitee限制上传的每个文件的大小&#xff0c;不能超过100MB 高于100MB无法上传到Gitee远程仓库&#xff0c;把超过大小的文件添加到Git忽略提交规…

融合基因组序列识别scATAC-seq的细胞类型

利用scATAC-seq技术进行单细胞分析&#xff0c;可以在单细胞分辨率下深入了解基因调控和表观遗传异质性&#xff0c;但由于数据的高维性和极端稀疏性&#xff0c;scATAC-seq的细胞注释仍然具有挑战性。现有的细胞注释方法大多集中在细胞峰矩阵上&#xff0c;没有充分利用潜在的…

【Flutter】 webview请求权限问题

需求&#xff1a;webview可以通过录音后语音转文字。 使用插件&#xff1a; permission_handler: ^11.0.1 webview_flutter: ^4.7.0 代码如下&#xff1a; 1.添加权限 添加安卓的权限&#xff1a; android/app/src/main/AndroidManifest.xml <uses-permission android…

vue使用EventBus进行跨组件通信

Vue中的EventBus&#xff0c;又称为事件总线&#xff0c;是一种常用的通信模式&#xff0c;它允许在Vue应用程序的不同组件之间进行松耦合的通信&#xff0c;尤其是对于那些没有直接父子关系的组件间的通信非常有用。EventBus基于Vue的自定义事件系统实现&#xff0c;工作原理遵…

商品指数创年内新高,粘性通胀成为美联储噩梦

文章概述 虽然美国4月CPI增幅放缓让美联储今年降息的可能性大增&#xff0c;但与此同时&#xff0c;大宗商品价格却达到了一年来的最高水平&#xff0c;粘性通胀可能成为美联储的噩梦。数据显示&#xff0c;跟踪24种能源、金属和农业合约彭博大宗商品现货指数今年以来已经上涨…

【ARM 嵌入式 C 入门及渐进 6.3 -- C 函数嵌入多条汇编语句 】

请阅读【嵌入式开发学习必备专栏】 文章目录 C 函数嵌入多条汇编语句C 函数嵌入多条汇编语句 在C代码中嵌入多条ARMv8汇编语句,可以通过将这些汇编指令放置在一个asm块内来实现。使用GCC的内嵌汇编语法,你可以顺序地编写多个指令,并根据需要指定输入、输出和被破坏(clobbe…

【APM】在Kubernetes中,使用Helm安装Prometheus Server 0.73.2(开启远程写入功能)

1、Prometheus 简介 Prometheus 是一款开源的监控和警报系统,起源于 SoundCloud 并在2012年开始被广泛采用。它在2016年成为 Cloud Native Computing Foundation (CNCF) 的成员项目,与 Kubernetes 齐名,是云原生计算领域的重要组成部分。Prometheus 以其强大的灵活性、易用…

训练的过程中内存一直增加的问题

可能的原因一&#xff1a; 解决pytorch训练的过程中内存一直增加的问题_pytorch训练过程中,内存一直增长-CSDN博客 可能的原因二&#xff1a; DataLoader num_workers > 0 causes CPU memory from parent process to be replicated in all worker processes Issue #13246…

DAY2 NETWORK

① 什么是IP地址 IP地址&#xff1a;是计算机在网络中唯一的标识&#xff0c;由两部分组成 分别是表示网络区域的网络号&#xff0c;和该网络下的主机编号 网络号&#xff1a;确定计算机所从属于哪个局域网络 主机号&#xff1a;计算机在该局域网络下的一个编号 ② IP的划分…

使用Flask ORM进行数据库操作的技术指南

文章目录 安装Flask SQLAlchemy配置数据库连接创建模型类数据库操作插入数据查询数据更新数据删除数据 总结 Flask是一个轻量级的Python Web框架&#xff0c;其灵活性和易用性使其成为开发人员喜爱的选择。而ORM&#xff08;对象关系映射&#xff09;则是一种将数据库中的表与面…