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,一经查实,立即删除!

相关文章

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…

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; 客户端向服务器发起的请求叫做请求报文。…

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

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

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

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

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

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

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

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

LeetCode题练习与总结:二叉树的最大深度--104

一、题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root […

ESP32开发环境搭建Windows VSCode集成Espressif IDF插件开发环境搭建 IDF_V5.2.1

一、安装Visual Studio Code 下载地址&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 打开上方链接&#xff0c;选择页面中的Windows版本&#xff0c;单击下载 将下载好的VSCodeUserSetup-x64-1.89.1.exe。单击右键&#xff0c;选择以管理员身份运行&#xf…

jenkins自动化部署详解

一、准备相关软件 整个自动化部署的过程就是从git仓库拉取最新代码&#xff0c;然后使用maven进行构建代码&#xff0c;构建包构建好了之后&#xff0c;通过ssh发送到发布服务的linux服务器的目录&#xff0c;最后在此服务器上执行相关的linux命令进行发布。 此篇文章jenkins…

【iOS安全】BurpSuite iOS https抓包 | DNS Spoofing

BurpSuite 完整版安装 参考&#xff1a;Admin Team 小数智 的博客 下载 Burp Suite 2021.6 官网下载地址 https://portswigger.net/burp/releases &#xff08;下载并安装好&#xff09; jdk 使用的是11.0.10 https://www.oracle.com/java/technologies/javase-jdk11-downl…

实用css整理

网页一键变灰 body{filter: grayscale(1); } 一般用于特殊时期&#xff0c;网页变灰&#xff0c;只需要给body标签添加这行样式代码。 一键换主题色 body {filter: hue-rotate(45deg);} 给body标签设置这个属性样式&#xff0c;改变角度看看效果吧。 设置字母大小写 p {t…

麦克纳母轮(全向)移动机器人集群控制的Simulink/Simscape虚拟仿真平台搭建

麦克纳姆轮是一种常见的全向移动机构&#xff0c;可以使机器人在平面内任意方向平移&#xff0c;同时可以利用差速轮车的属性实现自转&#xff0c;能够在狭窄且复杂多变的环境中自由运行&#xff0c;因而被广泛应用于竞赛机器人和特殊工业机器人场景。 Ps:最新的BYD仰望U8也有一…

项目启动失败,【consul】

如题&#xff0c;启动时项目未能正常启动&#xff0c;但上次都一切正常&#xff0c;日志提示&#xff1a; Consul service ids must not be empty, must start with a letter 经过排查是因为consul的consulconfigservice服务假死&#xff0c;导致无法正常获取到配置文件&am…

【全开源】Java无人共享棋牌室茶室台球室系统JAVA版本支持微信小程序+微信公众号

开启智能共享新时代 一、系统源码概述&#xff1a;引领自助服务潮流 随着科技的不断发展和人们生活节奏的加快&#xff0c;自助服务已逐渐成为人们生活中的一部分。为了满足市场对无人共享棋牌室、茶室、台球室的需求&#xff0c;我们推出了全新的无人共享系统源码。这套源码…

使用决策树对金融贷款数据进行分析

使用决策树对金融贷款数据进行分析 在本篇博客中&#xff0c;我们将通过使用 Python、Pandas 和多种机器学习技术&#xff0c;对一组贷款数据进行全面分析。通过详细的步骤展示&#xff0c;你将学会如何进行数据预处理、可视化分析以及构建预测模型。 第一步&#xff1a;导入…

Windows10安装Docker Desktop - WSL update failed

按照提示更新wsl后&#xff0c;仍然会报错&#xff0c;github上没有找到解决方法。版本28、29、30都会报这个错。 经过尝试&#xff0c;将docker内的设置中&#xff0c;采用wsl禁掉即可。如下图&#xff1a;

55. UE5 RPG 处理当前功能在多人模式中的问题

在UE里面&#xff0c;我们运行项目可以设置多种网络模式&#xff0c;主要是分为三种&#xff1a; 运行Standalone 就是单人模式&#xff0c;没有网络交互以监听服务器运行&#xff0c;在界面里运行的游戏会作为服务器使用以客户端运行&#xff0c;UE会单独运行一个线程作为服务…

【Linux】套接字的理解 基于TCP协议的套接字编程(单/多进程 / 线程池|英汉互译 / C++)

文章目录 1. 前言1.1 网络方面的预备知识&#x1f447;1.2 了解TCP协议 2. 关于套接字编程2.1 什么是套接字 Socket2.2 socket 的接口函数2.3 Udp套接字编程的步骤2.4 sockaddr 结构 3. 代码实现3.1 makefile3.2 log.hpp3.3 tcp_server.hpp① 框架② service() 通信服务③ init…

记录docker ps查找指定容器的几个命令

1.docker ps | grep registry 查询包含registry的容器 2.docker ps | grep -E "reigistry\s" 开启正则匹配模式&#xff0c;匹配registry后面为空格的容器&#xff0c;若是匹配一整行可以这样写docker ps | grep -E "^([0-9a-f]{12})\sregistry\s.*" 这…