Go 语言内置类型全解析:从布尔到字符串的全维度探究
关注微信公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。
本文深入探讨了 Go 语言的内置类型系统,从布尔类型到复杂的字符串类型,旨在为开发者提供全面而详尽的指导,通过丰富的代码示例和应用场景,揭示了如何在实际项目中高效地运用这些类型。
在编程中,类型(type)可以被看作是值(value)的模板,而值则可以被看作是类型的实例。在这篇文章里,我们专注于介绍Go语言的内置(或称为预声明的)基本类型和它们字面量的表示形式。这里并不涉及组合类型。

一、布尔类型
定义
在 Go 语言中,布尔类型用关键字 bool 表示,它有两个预定义的常量值:true 和 false。
var myBool bool = true
基础用法
声明与初始化
布尔变量可以在声明时初始化,也可以稍后进行赋值。
// 声明并初始化
var isReady bool = true
// 声明后赋值
var isEnabled bool
isEnabled = false
逻辑运算
布尔类型主要用于逻辑运算:AND (&&), OR (||), 和 NOT (!)。
// AND 操作
result := true && false // 输出:false
// OR 操作
result = true || false // 输出:true
// NOT 操作
result = !true // 输出:false
进阶用法
条件语句
布尔类型经常用于 if, else if 和 else 结构中。
if isReady {
fmt.Println("System is ready.")
} else {
fmt.Println("System is not ready.")
}
循环结构
布尔表达式也可用于控制循环结构如 for。
for isReady {
// 执行代码
}
函数返回值
布尔类型也经常用作函数的返回类型,以指示函数是否成功执行或验证。
func isAuthenticated() bool {
// 认证逻辑
return true
}
常见错误与陷阱
- 零值:布尔类型的零值为
false,需注意未初始化的布尔变量默认为false。 - 类型转换:Go 语言不允许布尔类型与其他类型(如整数)进行隐式转换。
二、整数类型
定义
在 Go 语言中,整数类型主要分为两大类:带符号(Signed)和无符号(Unsigned)的整数,同时还有一个特殊的整数类型 rune 和 byte。
- 带符号整数:
int8,int16,int32,int64,int - 无符号整数:
uint8,uint16,uint32,uint64,uint - 特殊整数:
rune(等同于int32),byte(等同于uint8)
基础用法
声明与初始化
// 声明并初始化带符号整数
var a int8 = -128
var b int32 = 2147483647
// 声明并初始化无符号整数
var c uint8 = 255
var d uint32 = 4294967295
运算符
常用的整数运算符包括:加(+)、减(-)、乘(*)、除(/)和模(%)。
// 整数运算
x := 10
y := 20
result := x + y // 结果为 30
位运算
整数还支持位运算:AND (&), OR (|), XOR (^), 以及位左移 (<<) 和位右移 (>>)。
// 位运算
var m uint8 = 1 << 3 // 结果为 8
进阶用法
数据溢出
需要注意的是,整数类型有范围限制,超过范围会导致数据溢出。
var maxInt8 int8 = 127
maxInt8 = maxInt8 + 1 // 溢出,结果为 -128
类型转换
在不同类型之间转换时,需显示使用类型转换。
var integer16 int16 = 32767
var integer32 int32
integer32 = int32(integer16) // 类型转换
类型推断
在使用 := 进行变量声明和初始化时,Go 语言会自动推断类型。
autoInt := 42 // 类型推断为 int
特殊整数类型
rune
rune 类型常用于表示一个 Unicode 字符。
var character rune = 'A'
byte
byte 类型通常用于处理 ASCII 字符或者二进制数据。
var b byte = 'a'
常见问题和陷阱
- 类型不匹配:不同整数类型之间不能直接进行运算。
- 数据溢出:进行算术运算时需注意数据溢出问题。
三、浮点数类型
定义
在 Go 语言中,浮点数类型主要有两种:
float32: 32 位浮点数,精度约为 7 位小数。float64: 64 位浮点数,精度约为 15 位小数。
基础用法
声明与初始化
// 声明并初始化 float32 和 float64
var a float32 = 3.14
var b float64 = 3.141592653589793
常用运算
常用的运算符包括:加(+)、减(-)、乘(*)、除(/)。
x := 1.1
y := 2.2
result := x + y // 结果为 3.3
进阶用法
精度问题
由于计算机内部表示浮点数的限制,会有精度问题。
// 精度问题
var c float32 = 0.1
var d float32 = 0.2
var e float32 = 0.3
if c+d == e {
fmt.Println("Equal")
} else {
fmt.Println("Not Equal") // 输出 "Not Equal"
}
数学函数
Go 语言的 math 包提供了丰富的数学函数。
import "math"
// 开方
result := math.Sqrt(16.0) // 结果为 4.0
类型转换与推断
// 类型转换
var f float32 = 1.1
var g float64
g = float64(f) // 类型转换
// 类型推断
autoFloat := 3.14 // Go 语言会自动推断为 float64 类型
特殊情况
表示无穷大和 NaN
// 无穷大
var inf float64 = math.Inf(1)
// NaN (Not a Number)
var nan float64 = math.NaN()
与整数的转换
注意:转换时可能会有精度损失。
var h float64 = 3.9
var i int = int(h) // 结果为 3
常见问题和陷阱
- 精度问题:进行浮点数运算时,需要注意精度问题。
- 类型转换:在整数和浮点数之间转换时,要注意精度损失。
四、字符串类型
定义
在 Go 语言中,字符串类型被定义为一串不可变的字节序列,通常用于存储文本数据。
// 声明一个字符串类型的变量
var str string
基础用法
声明和初始化
// 声明并初始化一个字符串
var hello string = "Hello, world!"
或者使用短变量声明:
hello := "Hello, world!"
常用操作
字符串拼接:
str1 := "Hello"
str2 := "World"
result := str1 + ", " + str2 // 结果:"Hello, World"
获取字符串长度:
length := len("Hello, World!") // 结果:13
进阶用法
字符串与字节切片
在 Go 中,可以方便地在字符串和字节切片之间进行转换。
// 字符串转字节切片
byteSlice := []byte("Hello")
// 字节切片转字符串
str := string(byteSlice)
字符串截取
// 截取字符串中的部分字符
subStr := "Hello, World!"[7:12] // 结果:"World"
字符串遍历
// 遍历字符串中的每一个字符
for i, r := range "Hello" {
fmt.Printf("%d: %c\n", i, r)
}
输出:
0: H
1: e
2: l
3: l
4: o
特殊用法
多行字符串
使用反引号( ` )可以声明一个多行字符串。
multiLineStr := `This is
a multi-line
string.`
转义字符
Go 字符串支持多种转义字符,如 \n(换行)、\t(制表符)等。
// 使用转义字符
escapedStr := "This is a line.\nThis is another line."
常见问题和陷阱
- 不可变性:Go 字符串是不可变的,任何尝试改变字符串内容的操作都会创建一个新的字符串。
- Unicode 和 UTF-8:Go 字符串默认使用 UTF-8 编码,这意味着一个字符串可能包含多种不同长度的字符。
五、其他特性
在前几章节中,我们详细地探究了 Go 语言的各种内置类型:从布尔型到整数、浮点数和字符串。这些基础类型构成了 Go 语言的基础结构,对于编写高性能和可维护代码非常重要。
类型系统的简洁与高效
Go 语言的类型系统相对简单,但并不意味着它不强大或灵活。恰恰相反,Go 语言提供了一套非常高效和易于理解的类型机制。
var isActive bool // 布尔类型
var price int32 // 整数类型
var pi float32 // 浮点数类型
var name string // 字符串类型
为什么不可变性很重要
在 Go 中,字符串是不可变的,这有助于多线程编程。不可变性确保了在并发访问时,数据状态始终是可预测的。
// 字符串不可变性示例
str := "immutable"
// str[0] = 'I' // 编译错误
性能与优化
Go 提供了大量内建函数和标准库,以优化各种类型的操作。
import "math"
// 浮点数优化
result := math.Floor(3.75) // 输出:3.0
其他
- 类型别名与自定义类型: Go 允许你创建类型别名和自定义类型,这对于编写领域特定代码非常有用。
- 严格类型检查: Go 的编译器会进行严格的类型检查,这大大减少了运行时错误。
- 减少转换: Go 的类型推断和接口机制,减少了不必要的类型转换。
关注微信公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。
如有帮助,请多关注
个人微信公众号:【TechLeadCloud】分享AI与云服务研发的全维度知识,谈谈我作为TechLead对技术的独特洞察。
TeahLead KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。
Go 语言内置类型全解析:从布尔到字符串的全维度探究的更多相关文章
- Go语言内置类型和函数
内置类型 内置函数 Go 语言拥有一些不需要进行导入操作就可以使用的内置函数.它们有时可以针对不同的类型进行操作,例如:len.cap 和 append,或必须用于系统级的操作,例如:panic.因此 ...
- (转)ASP.NET缓存全解析6:数据库缓存依赖
ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓 ...
- dart系列之:dart语言中的内置类型
目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...
- Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型
ylbtech-Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型 1.返回顶部 1. 整型数值类型(C# 参考) 2019/10/22 “整型数值类型”是“简单类型”的 ...
- Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:值类型的功能
ylbtech-Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:值类型的功能 1.返回顶部 1. 值类型(C# 参考) 2018/11/26 有两种值类型: 结构 枚举 值类型的主 ...
- python内置类型详细解释
文章编写借鉴于内置类型 - Python 3.7.3 文档,主要用于自己学习和记录 python主要内置类型包括数字.序列.映射.类.实例和异常 有些多项集类是可变的.它们用于添加.移除或重排其成员的 ...
- (转)Unity3D移动平台动态读取外部文件全解析
Unity3D移动平台动态读取外部文件全解析 c#语言规范 阅读目录 前言: 假如我想在editor里动态读取文件 移动平台的资源路径问题 移动平台读取外部文件的方法 补充: 回到目录 前言: 一直有 ...
- C++基本内置类型
C++基本内置类型 基本内置类型包括算术类型和空类型. 算术类型 算术类型包括整型和浮点型. 类型 含义 最小尺寸 bool 布尔型 - char 字符型 8 bit wchar_t 宽字符型 16 ...
- slice全解析
slice全解析 昨天组内小伙伴做分享,给出了这么一段代码: package main import ( "fmt" ) func fun1(x int) { x = x + 1 ...
- 3、python内置类型(0529)
python的内置对象类型以及支持的运算 python对象的相关术语 python程序中保存的所有数据都是围绕对象这个概念展开的 程序中存储的所有数据都是对象 每个对象都有一个身份.一个类型和一个值 ...
随机推荐
- IIC通信协议
1.IIC 通信协议简介 I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的, 由于它引脚少,硬件实现简单,可扩展性强,不需要 USART.CAN 等 ...
- 00.Webstrom的基本入门设置
1.取消红框类自动打开项目 2.打开轮滚缩放代码 3.设置代码字体,这里选择的是Consolas 推荐免费字体:https://files.cnblogs.com/files/huadaxia/jet ...
- 自然语言处理 Paddle NLP - 预训练语言模型及应用
什么是语言理解? 关于疫情的一段对话: 中国:我们这边快完了 欧洲:我们这边快完了 中国:我们好多了 欧洲:我们好多了 挑战: 语言的复杂性和多样性 多义/同义/歧义现象 灵活多变的表达形式 语言背后 ...
- 发布:iNeuOS工业互联网操作系统 V5 Preview1 版本(自主可控)
这半年来一直深耕包头,这个城市比较不错,但是推进项目的难度确实挺大的.与开发产品相比,后者更省心.但是光研发产品,没有项目依托,没办法产生价值.有些大学和研究院确实有好的产品,但是没有市场化能力,再好 ...
- ApacheSpark:HowtoBuildandDeployaRealtimeDataProcessinga
目录 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成与测试 4.1 应用场景介绍 4.2 应用实例分析 4. ...
- Uniapp下GoEasy通知栏推送不工作问题排查记录
我们是uniapp开发的app,项目中的系统消息推送使用的是GoEasy Websocket 实时推送,上线一段时间后,客户反馈说,当app没有在前台运行时也需要想办法通知用户一些重要的系统通知.那么 ...
- JavaCV的摄像头实战之十三:年龄检测
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV的摄像头实战> ...
- python datetime.now() 的问题
python中,获取指定日期格式的时间可以用 datetime.datetime.now().strftime("%Y-%m-%d") 定义函数的时候,是可以设置参数的默认值的. ...
- 【Vue】父子组件传值、方法引用
父子组件值.方法引用 1.值 1.1 父组件获取子组件值 父组件 <template> <div> <button @click="getChildValue& ...
- DolphinScheduler3.1.7离线手册
DolphinScheduler3.1.7 DolphinScheduler简介 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统.适用于企业级场 ...