关注微信公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

本文深入探讨了 Go 语言的内置类型系统,从布尔类型到复杂的字符串类型,旨在为开发者提供全面而详尽的指导,通过丰富的代码示例和应用场景,揭示了如何在实际项目中高效地运用这些类型。

在编程中,类型(type)可以被看作是值(value)的模板,而值则可以被看作是类型的实例。在这篇文章里,我们专注于介绍Go语言的内置(或称为预声明的)基本类型和它们字面量的表示形式。这里并不涉及组合类型。

一、布尔类型

定义

在 Go 语言中,布尔类型用关键字 bool 表示,它有两个预定义的常量值:truefalse

  1. var myBool bool = true

基础用法

声明与初始化

布尔变量可以在声明时初始化,也可以稍后进行赋值。

  1. // 声明并初始化
  2. var isReady bool = true
  3. // 声明后赋值
  4. var isEnabled bool
  5. isEnabled = false

逻辑运算

布尔类型主要用于逻辑运算:AND (&&), OR (||), 和 NOT (!)。

  1. // AND 操作
  2. result := true && false // 输出:false
  3. // OR 操作
  4. result = true || false // 输出:true
  5. // NOT 操作
  6. result = !true // 输出:false

进阶用法

条件语句

布尔类型经常用于 if, else ifelse 结构中。

  1. if isReady {
  2. fmt.Println("System is ready.")
  3. } else {
  4. fmt.Println("System is not ready.")
  5. }

循环结构

布尔表达式也可用于控制循环结构如 for

  1. for isReady {
  2. // 执行代码
  3. }

函数返回值

布尔类型也经常用作函数的返回类型,以指示函数是否成功执行或验证。

  1. func isAuthenticated() bool {
  2. // 认证逻辑
  3. return true
  4. }

常见错误与陷阱

  1. 零值:布尔类型的零值为 false,需注意未初始化的布尔变量默认为 false
  2. 类型转换:Go 语言不允许布尔类型与其他类型(如整数)进行隐式转换。

二、整数类型

定义

在 Go 语言中,整数类型主要分为两大类:带符号(Signed)和无符号(Unsigned)的整数,同时还有一个特殊的整数类型 runebyte

  • 带符号整数: int8, int16, int32, int64, int
  • 无符号整数: uint8, uint16, uint32, uint64, uint
  • 特殊整数: rune (等同于 int32), byte (等同于 uint8)

基础用法

声明与初始化

  1. // 声明并初始化带符号整数
  2. var a int8 = -128
  3. var b int32 = 2147483647
  4. // 声明并初始化无符号整数
  5. var c uint8 = 255
  6. var d uint32 = 4294967295

运算符

常用的整数运算符包括:加(+)、减(-)、乘(*)、除(/)和模(%)。

  1. // 整数运算
  2. x := 10
  3. y := 20
  4. result := x + y // 结果为 30

位运算

整数还支持位运算:AND (&), OR (|), XOR (^), 以及位左移 (<<) 和位右移 (>>)。

  1. // 位运算
  2. var m uint8 = 1 << 3 // 结果为 8

进阶用法

数据溢出

需要注意的是,整数类型有范围限制,超过范围会导致数据溢出。

  1. var maxInt8 int8 = 127
  2. maxInt8 = maxInt8 + 1 // 溢出,结果为 -128

类型转换

在不同类型之间转换时,需显示使用类型转换。

  1. var integer16 int16 = 32767
  2. var integer32 int32
  3. integer32 = int32(integer16) // 类型转换

类型推断

在使用 := 进行变量声明和初始化时,Go 语言会自动推断类型。

  1. autoInt := 42 // 类型推断为 int

特殊整数类型

rune

rune 类型常用于表示一个 Unicode 字符。

  1. var character rune = 'A'

byte

byte 类型通常用于处理 ASCII 字符或者二进制数据。

  1. var b byte = 'a'

常见问题和陷阱

  1. 类型不匹配:不同整数类型之间不能直接进行运算。
  2. 数据溢出:进行算术运算时需注意数据溢出问题。

三、浮点数类型

定义

在 Go 语言中,浮点数类型主要有两种:

  • float32: 32 位浮点数,精度约为 7 位小数。
  • float64: 64 位浮点数,精度约为 15 位小数。

基础用法

声明与初始化

  1. // 声明并初始化 float32 和 float64
  2. var a float32 = 3.14
  3. var b float64 = 3.141592653589793

常用运算

常用的运算符包括:加(+)、减(-)、乘(*)、除(/)。

  1. x := 1.1
  2. y := 2.2
  3. result := x + y // 结果为 3.3

进阶用法

精度问题

由于计算机内部表示浮点数的限制,会有精度问题。

  1. // 精度问题
  2. var c float32 = 0.1
  3. var d float32 = 0.2
  4. var e float32 = 0.3
  5. if c+d == e {
  6. fmt.Println("Equal")
  7. } else {
  8. fmt.Println("Not Equal") // 输出 "Not Equal"
  9. }

数学函数

Go 语言的 math 包提供了丰富的数学函数。

  1. import "math"
  2. // 开方
  3. result := math.Sqrt(16.0) // 结果为 4.0

类型转换与推断

  1. // 类型转换
  2. var f float32 = 1.1
  3. var g float64
  4. g = float64(f) // 类型转换
  5. // 类型推断
  6. autoFloat := 3.14 // Go 语言会自动推断为 float64 类型

特殊情况

表示无穷大和 NaN

  1. // 无穷大
  2. var inf float64 = math.Inf(1)
  3. // NaN (Not a Number)
  4. var nan float64 = math.NaN()

与整数的转换

注意:转换时可能会有精度损失。

  1. var h float64 = 3.9
  2. var i int = int(h) // 结果为 3

常见问题和陷阱

  1. 精度问题:进行浮点数运算时,需要注意精度问题。
  2. 类型转换:在整数和浮点数之间转换时,要注意精度损失。

四、字符串类型

定义

在 Go 语言中,字符串类型被定义为一串不可变的字节序列,通常用于存储文本数据。

  1. // 声明一个字符串类型的变量
  2. var str string

基础用法

声明和初始化

  1. // 声明并初始化一个字符串
  2. var hello string = "Hello, world!"

或者使用短变量声明:

  1. hello := "Hello, world!"

常用操作

字符串拼接:

  1. str1 := "Hello"
  2. str2 := "World"
  3. result := str1 + ", " + str2 // 结果:"Hello, World"

获取字符串长度:

  1. length := len("Hello, World!") // 结果:13

进阶用法

字符串与字节切片

在 Go 中,可以方便地在字符串和字节切片之间进行转换。

  1. // 字符串转字节切片
  2. byteSlice := []byte("Hello")
  3. // 字节切片转字符串
  4. str := string(byteSlice)

字符串截取

  1. // 截取字符串中的部分字符
  2. subStr := "Hello, World!"[7:12] // 结果:"World"

字符串遍历

  1. // 遍历字符串中的每一个字符
  2. for i, r := range "Hello" {
  3. fmt.Printf("%d: %c\n", i, r)
  4. }

输出:

  1. 0: H
  2. 1: e
  3. 2: l
  4. 3: l
  5. 4: o

特殊用法

多行字符串

使用反引号( ` )可以声明一个多行字符串。

  1. multiLineStr := `This is
  2. a multi-line
  3. string.`

转义字符

Go 字符串支持多种转义字符,如 \n(换行)、\t(制表符)等。

  1. // 使用转义字符
  2. escapedStr := "This is a line.\nThis is another line."

常见问题和陷阱

  1. 不可变性:Go 字符串是不可变的,任何尝试改变字符串内容的操作都会创建一个新的字符串。
  2. Unicode 和 UTF-8:Go 字符串默认使用 UTF-8 编码,这意味着一个字符串可能包含多种不同长度的字符。

五、其他特性

在前几章节中,我们详细地探究了 Go 语言的各种内置类型:从布尔型到整数、浮点数和字符串。这些基础类型构成了 Go 语言的基础结构,对于编写高性能和可维护代码非常重要。

类型系统的简洁与高效

Go 语言的类型系统相对简单,但并不意味着它不强大或灵活。恰恰相反,Go 语言提供了一套非常高效和易于理解的类型机制。

  1. var isActive bool // 布尔类型
  2. var price int32 // 整数类型
  3. var pi float32 // 浮点数类型
  4. var name string // 字符串类型

为什么不可变性很重要

在 Go 中,字符串是不可变的,这有助于多线程编程。不可变性确保了在并发访问时,数据状态始终是可预测的。

  1. // 字符串不可变性示例
  2. str := "immutable"
  3. // str[0] = 'I' // 编译错误

性能与优化

Go 提供了大量内建函数和标准库,以优化各种类型的操作。

  1. import "math"
  2. // 浮点数优化
  3. result := math.Floor(3.75) // 输出:3.0

其他

  1. 类型别名与自定义类型: Go 允许你创建类型别名和自定义类型,这对于编写领域特定代码非常有用。
  2. 严格类型检查: Go 的编译器会进行严格的类型检查,这大大减少了运行时错误。
  3. 减少转换: Go 的类型推断和接口机制,减少了不必要的类型转换。

关注微信公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

如有帮助,请多关注

个人微信公众号:【TechLeadCloud】分享AI与云服务研发的全维度知识,谈谈我作为TechLead对技术的独特洞察。

TeahLead KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。

Go 语言内置类型全解析:从布尔到字符串的全维度探究的更多相关文章

  1. Go语言内置类型和函数

    内置类型 内置函数 Go 语言拥有一些不需要进行导入操作就可以使用的内置函数.它们有时可以针对不同的类型进行操作,例如:len.cap 和 append,或必须用于系统级的操作,例如:panic.因此 ...

  2. (转)ASP.NET缓存全解析6:数据库缓存依赖

    ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓 ...

  3. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

  4. Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型

    ylbtech-Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型 1.返回顶部 1. 整型数值类型(C# 参考) 2019/10/22 “整型数值类型”是“简单类型”的 ...

  5. Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:值类型的功能

    ylbtech-Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:值类型的功能 1.返回顶部 1. 值类型(C# 参考) 2018/11/26 有两种值类型: 结构 枚举 值类型的主 ...

  6. python内置类型详细解释

    文章编写借鉴于内置类型 - Python 3.7.3 文档,主要用于自己学习和记录 python主要内置类型包括数字.序列.映射.类.实例和异常 有些多项集类是可变的.它们用于添加.移除或重排其成员的 ...

  7. (转)Unity3D移动平台动态读取外部文件全解析

    Unity3D移动平台动态读取外部文件全解析 c#语言规范 阅读目录 前言: 假如我想在editor里动态读取文件 移动平台的资源路径问题 移动平台读取外部文件的方法 补充: 回到目录 前言: 一直有 ...

  8. C++基本内置类型

    C++基本内置类型 基本内置类型包括算术类型和空类型. 算术类型 算术类型包括整型和浮点型. 类型 含义 最小尺寸 bool 布尔型 - char 字符型 8 bit wchar_t 宽字符型 16 ...

  9. slice全解析

    slice全解析 昨天组内小伙伴做分享,给出了这么一段代码: package main import ( "fmt" ) func fun1(x int) { x = x + 1 ...

  10. 3、python内置类型(0529)

    python的内置对象类型以及支持的运算 python对象的相关术语 python程序中保存的所有数据都是围绕对象这个概念展开的 程序中存储的所有数据都是对象 每个对象都有一个身份.一个类型和一个值 ...

随机推荐

  1. 越小越好: Q8-Chat,在英特尔至强 CPU 上体验高效的生成式 AI

    大语言模型 (LLM) 正在席卷整个机器学习世界.得益于其 transformer 架构,LLM 拥有从大量非结构化数据 (如文本.图像.视频或音频) 中学习的不可思议的能力.它们在 多种任务类型 上 ...

  2. Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】

    〇.简介 1.什么是简单工厂模式? 一句话解释:   客户类和工厂类严格分工,客户类只需知道怎么用,处理逻辑交给工厂类. 简单工厂模式(Simple Factory Pattern)是日常开发中常用的 ...

  3. day08-SpringCloud Gateway-服务网关

    SpringCloud Gateway-服务网关 1.Gateway介绍 1.1引出问题 没有使用网关服务时: 使用网关服务后: 1.2Gateway网络拓扑图 1.3Gateway是什么 官网:Sp ...

  4. 如何卸载 python setup.py install 安装的包?

    当我们半自动安装某些 python 包时,总是存在很多依赖关系的问题,而这些问题还是很难避免的,所以,当我们安装一个不确定的包的时候,最好提前收集一些相关资料,或者请教他人,同时最好把安装过程都记录下 ...

  5. Oracle Users表空间重命名

    需求:默认无法直接删除Oracle的users表空间,直接尝试删除会有报错如下: SQL> drop tablespace users including contents and datafi ...

  6. jQuery控制图片墙自动+手动淡入淡出切换

    先来看一下效果:http://39.105.101.122/myhtml/Jquery/img_switch/img_switch.html(甄嬛的眼睛有木有变大) 添加一个div(class=con ...

  7. 前端学习C语言 - 初级指针

    初级指针 本篇主要介绍:指针和变量的关系.指针类型.指针的运算符.空指针和野指针.指针和数组.指针和字符串.const 和指针.以及gdb 调试段错误. 基础概念 指针是一种特殊的变量.存放地址的变量 ...

  8. C++面试八股文:什么是构造函数?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第29面: 面试官:什么是构造函数? 二师兄:构造函数是一种特殊的成员函数,用于创建和初始化类的对象.构造函数的名称与类的名称相同,并且没有返回类型. ...

  9. 2023-07-04:给定一个数组A, 把它分成两个数组B和C 对于数组A每个i位置的数来说, A[i] = B[i] + C[i] 也就是一个数字分成两份,然后各自进入B和C 要求B[i], C[i

    2023-07-04:给定一个数组A, 把它分成两个数组B和C 对于数组A每个i位置的数来说, A[i] = B[i] + C[i] 也就是一个数字分成两份,然后各自进入B和C 要求B[i], C[i ...

  10. JVM GC配置指南

    本文旨在简明扼要说明各回收器调优参数,如有疏漏欢迎指正. 1.JDK版本 以下所有优化全部基于JDK8版本,强烈建议低版本升级到JDK8,并尽可能使用update_191以后版本. 2.如何选择垃圾回 ...