Go to Learn Go之基本数据类型

概述

在上一节的内容中,我们介绍了Go的基础语法,包括:标识符、关键字、行分隔符、var关键字、:=运算符、空格、注释、package、import、输入输出、运算符、条件控制、循环等。在本节中,我们将介绍Go的基本数据类型。Go语言是一种静态类型的编程语言,这也就意味着,声明变量需要指定其具体类型,或者交由编译器进行自动推导。在Go语言中,数据类型是编程的基础,它定义了变量或表达式的存储方式和行为。

布尔类型

布尔类型(Boolean)用于表示真或假的值,可以为true或false。布尔类型被声明为bool,可以使用条件语句或逻辑运算符进行比较和操作。

go 复制代码
package main

import "fmt"

func main() {
    var success bool = true
    if success {
        fmt.Println("Success")
    } else {
        fmt.Println("Failed")
    }
}

与C/C++语言不同,Go语言中的布尔值并不会隐式转换为数字值0或1,反之亦然。另外,Go语言也不允许将整型强制转换为布尔型。

go 复制代码
package main

import "fmt"

func main() {
    var age int = 18
    // 不允许将整型强制转换为布尔型,会发生编译错误
    var larger bool = bool(age)
    // 布尔值不会隐式转换为数字值,会发生编译错误
    age = larger

    if larger {
        fmt.Println("Success")
    } else {
        fmt.Println("Failed")
    }
}

整数类型

整数类型(Integer)用于表示整数值,包括正数、负数和零。Go语言同时提供了有符号和无符号的整数类型,其中有符号整数包括:int8、int16、int32、int64,分别对应 8、16、32、64位大小的有符号整数,无符号整数包括:uint8、uint16、uint32、uint64,分别对应 8、16、32、64位大小的无符号整数。

另外,还有两种整数类型int和uint,分别对应特定CPU平台的字长。其中int表示有符号整数,应用最为广泛,uint表示无符号整数。由于编译器和计算机硬件的不同,int和uint所能表示的整数大小会在32位和64位之间变化。

注意:尽管在某些特定的运行环境下,int、uint、int32、uint32的大小可能相等,但它们仍然属于不同的数据类型。比如:int类型的大小可能是32位,但需要把int类型当做int32类型使用时,必须显式对类型进行转换,反之亦然。

除了上述的基本整数类型,Go语言还提供了其他几种整数类型,包括:

rune:该类型表示Unicode码点,通常用来表示一个Unicode字符。

byte:与uint8是同义词,表示一个字节。

uintptr:该类型的大小不确定,与平台和编译器有关,但足以存放指针。uintptr通常用于底层编程,特别是与C程序库交互的地方。

go 复制代码
package main

import "fmt"

func main() {
    var num1 int8 = 66
    var num2 uint16 = 3666
    var num3 int = 99
    fmt.Println(num1, num2, num3)

    // int不能直接转换为int32,输出:cannot use num3 
    // (variable of type int) as int32 value in variable declaration
    // var num4 int32 = num3
    // 使用类型转换,可以将int转换为int32
    var num4 int32 = int32(num3)
    fmt.Println(num4)

    var num5 byte = 100
    fmt.Println(num5)
}

浮点数类型

浮点数类型(Float)用于表示带有小数点的数值,Go语言提供了float32(32位单精度浮点数)和float64(64位双精度浮点数)两种浮点数类型。单精度浮点数在内存中占用32位(4字节),可以表示的范围大约是±1.18E-38到±3.4E+38。双精度浮点数在内存中占用64位(8字节),可以表示的范围更大,大约是±2.23E-308到±1.80E+308。在Go语言中,可以使用关键字float32、float64来分别声明和初始化单精度浮点数、双精度浮点数。

go 复制代码
package main

import "fmt"
import "math"

func main() {
    var num1 float32 = 3.1415926535
    // 输出: 3.1415927
    fmt.Println(num1)

    var num2 float64 = 3.1415926535
    // 输出: 3.1415926535
    fmt.Println(num2)

    epsilon := 0.00001
    num3 := 3.1415926
    // 浮点数比较,输出:equal
    if math.Abs(num2 - num3) < epsilon {
        fmt.Println("equal")
    } else {
        fmt.Println("not equal")
    }
}

注意:由于浮点数的精度问题,在进行浮点数计算时可能会产生误差。为了避免误差问题,尽量避免进行浮点数比较或直接比较浮点数的相等性,而应使用一个小的容忍度值进行比较。

复数类型

复数类型(Complex)用于表示复数值,由实部和虚部组成。Go语言提供了complex64(64位实数和虚数的复数)和complex128(128位实数和虚数的复数)两种复数类型。

go 复制代码
package main

import "fmt"

func main() {
    var num1 complex64 = 3.14 + 66i
    // 输出复数的实部和虚部,输出:3.140000 + 66.000000i
    fmt.Printf("%f + %fi\n", real(num1), imag(num1))

    var num2 complex64 = 10 + 10i
    var num = num1 + num2
    // 复数相加,输出:13.140000 + 76.000000i
    fmt.Printf("%f + %fi\n", real(num), imag(num))
}

注意:Go语言的复数类型是支持加、减、乘、除等基本运算的,可以使用相应的运算符进行复数运算。

字符串类型

字符串类型(String)用于表示文本数据,字符串是由零个或多个字符组成的不可变序列。Go语言中的字符串是不可变的字节序列,每个字符串都由一个指向字节数组的指针和长度组成。字符串的长度可以通过len()函数获取,而字符串的内容可以通过索引访问。

go 复制代码
package main

import "fmt"

func main() {
    var str string = "Hello"
    length := len(str)
    // 输出字符串长度:5
    fmt.Println(length)

    // 取第一个字符
    firstChar := str[0]
    // 取最后一个字符
    lastChar := str[len(str) - 1]
    // 输出:H, o
    fmt.Printf("%c, %c\n", firstChar, lastChar)
}

字符串还可进行连接、切片、比较、替换、分割等操作,可参考下面的示例代码。

go 复制代码
package main

import "fmt"
import "strings"

func main() {
    var str1 string = "Hello"
    str2 := "World"

    // 字符串连接,输出:Hello World
    str := str1 + " " + str2
    fmt.Println(str)

    // 字符串切片,从索引0开始,到索引5结束(不包括5),输出:Hello
    slice := str[0:5]
    fmt.Println(slice)

    // 字符串比较,输出:larger
    if str1 > str2 {
        fmt.Println("larger")
    } else {
        fmt.Println("equal or smaller")
    }

    // 字符串替换,将"World"替换为"Go",第四个参数为替换的次数,-1表示替换所有匹配的子字符串
    newStr := strings.Replace(str, "World", "Go", -1)
    // 输出:Hello Go
    fmt.Println(newStr)

    // 字符串分割,以空格为分隔符,输出:[Hello World]
    subStrs := strings.Split(str, " ")
    fmt.Println(subStrs)
}
相关推荐
ん贤26 分钟前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt1113 小时前
AI DDD重构实践
go
Grassto2 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto4 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室5 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题5 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉6 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想
asaotomo7 天前
一款 AI 驱动的新一代安全运维代理 —— DeepSentry(深哨)
运维·人工智能·安全·ai·go
码界奇点8 天前
基于Gin与GORM的若依后台管理系统设计与实现
论文阅读·go·毕业设计·gin·源代码管理
迷迭香与樱花8 天前
Gin 框架
go·gin