Go to Learn Go之基本数据类型

简介: Go to Learn Go之基本数据类型

概述

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

布尔类型

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

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语言也不允许将整型强制转换为布尔型。

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程序库交互的地方。

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来分别声明和初始化单精度浮点数、双精度浮点数。

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位实数和虚数的复数)两种复数类型。

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()函数获取,而字符串的内容可以通过索引访问。

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)
}

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

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)
}


相关文章
|
5月前
|
Go
跳转语句:break、continue、goto -《Go语言实战指南》
本文介绍了 Go 语言中的三种跳转语句:`break`、`continue` 和 `goto`。`break` 用于跳出当前循环或选择结构,如 `for`、`switch` 和 `select`;`continue` 跳过当前循环的剩余部分并进入下一轮;`goto` 实现无条件跳转到指定标签,但需慎用以保持代码清晰。通过示例代码展示了它们的具体用法,并建议优先使用 `break` 和 `continue`,仅在特定场景(如资源清理)下考虑 `goto`。
|
11月前
|
存储 编译器 Go
go语言中的变量、常量、数据类型
【11月更文挑战第3天】
120 9
|
11月前
|
Go
go语言中的goto 语句
go语言中的goto 语句
191 2
Go to Learn Go之命令行参数
Go to Learn Go之命令行参数
96 8
|
Serverless Go
Go to Learn Go之时间日期
Go to Learn Go之时间日期
130 8
Go to Learn Go之Gob
Go to Learn Go之Gob
63 8
Go to Learn Go之文件操作
Go to Learn Go之文件操作
65 8
Go to Learn Go之反射
Go to Learn Go之反射
102 8
|
8月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
8月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。