Go 语言提供了丰富的数据类型,用来表示不同的值和对象。数据类型是编程语言的基础之一,它决定了数据存储的方式和可以执行的操作。在 Go 语言中,数据类型主要分为基本类型、复合类型和接口类型。理解这些类型对于有效地编写 Go 程序至关重要。


📖 目录

  1. 基本数据类型
    1. 整型
    2. 浮点型
    3. 布尔型
    4. 字符型
    5. 字符串
  2. 复合数据类型
    1. 数组
    2. 切片
    3. 映射
    4. 结构体
    5. 接口
    6. 通道
  3. 类型转换
  4. 常量
  5. 参考资料

1. 基本数据类型

1.1 整型

Go 支持多种整型,分为带符号(有符号)和无符号两种。每种类型有不同的存储大小。

  • int:根据平台(32位或64位)决定大小,通常为 32 位或 64 位。
  • int8:8 位有符号整型,值的范围为 -128 到 127。
  • int16:16 位有符号整型,值的范围为 -32,768 到 32,767。
  • int32:32 位有符号整型,值的范围为 -2^31 到 2^31-1。
  • int64:64 位有符号整型,值的范围为 -2^63 到 2^63-1。
  • uint8:8 位无符号整型,值的范围为 0 到 255。
  • uint16:16 位无符号整型,值的范围为 0 到 65,535。
  • uint32:32 位无符号整型,值的范围为 0 到 4,294,967,295。
  • uint64:64 位无符号整型,值的范围为 0 到 18,446,744,073,709,551,615.

示例:

package main

import "fmt"

func main() {
    var x int = 42
    var y int8 = 127
    var z uint = 255

    fmt.Println(x) // 输出: 42
    fmt.Println(y) // 输出: 127
    fmt.Println(z) // 输出: 255
}

1.2 浮点型

Go 支持两种浮点数类型:

  • float32:32 位浮点数,精度较低。
  • float64:64 位浮点数,精度较高,通常是默认浮点类型。

示例:

package main

import "fmt"

func main() {
    var a float32 = 3.14
    var b float64 = 2.71828

    fmt.Println(a) // 输出: 3.14
    fmt.Println(b) // 输出: 2.71828
}

1.3 布尔型

布尔类型只包含两个值:

  • true:表示真。
  • false:表示假。

示例:

package main

import "fmt"

func main() {
    var isActive bool = true
    var isValid bool = false

    fmt.Println(isActive) // 输出: true
    fmt.Println(isValid)  // 输出: false
}

1.4 字符型

Go 使用 rune(即 UTF-8 编码的字符)来表示字符类型。rune 是一个别名,实际类型是 int32,它表示一个 Unicode 字符。

示例:

package main

import "fmt"

func main() {
    var char rune = 'A'

    fmt.Println(char) // 输出: 65(字符 'A' 的 Unicode 编码)
}

1.5 字符串

字符串类型表示一组字符序列。在 Go 中,字符串是不可变的,意味着一旦创建,它的内容不能被修改。

  • 字符串是 Unicode 编码的字节序列。
  • 字符串的长度是字节长度,而不是字符数(因为某些字符可能占用多个字节)。

示例:

package main

import "fmt"

func main() {
    var str string = "Hello, Go!"

    fmt.Println(str) // 输出: Hello, Go!
}


2. 复合数据类型

2.1 数组

数组是固定长度的序列,数组的长度必须在声明时指定,并且是不可改变的。数组的元素类型必须相同。

示例:

package main

import "fmt"

func main() {
    var arr [3]int = [3]int{1, 2, 3}

    fmt.Println(arr) // 输出: [1 2 3]
}

2.2 切片

切片是 Go 中最常用的集合类型,它是动态大小的,可以随时扩展。与数组不同,切片的长度可以改变,且它并不存储数据,而是指向一个底层数组。

示例:

package main

import "fmt"

func main() {
    var slice []int = []int{1, 2, 3}

    fmt.Println(slice) // 输出: [1 2 3]
}

2.3 映射(Map)

映射是一种键值对数据结构,类似于哈希表或字典。每个键都映射到一个值。

示例:

package main

import "fmt"

func main() {
    m := map[string]int{"apple": 5, "banana": 7}

    fmt.Println(m) // 输出: map[apple:5 banana:7]
}

2.4 结构体

结构体是用户自定义的复合数据类型,它可以包含不同类型的字段。结构体通常用于表示实体对象,如学生、员工等。

示例:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{Name: "John", Age: 30}
    fmt.Println(p) // 输出: {John 30}
}

2.5 接口

接口定义了一个类型集合,任何实现了接口方法的类型都被认为是该接口的实现。Go 的接口是一种隐式实现,意味着不需要显式声明某个类型实现了某个接口。

示例:

package main

import "fmt"

type Speaker interface {
    Speak() string
}

type Person struct {
    Name string
}

func (p Person) Speak() string {
    return "Hello, " + p.Name
}

func main() {
    var s Speaker = Person{Name: "John"}
    fmt.Println(s.Speak()) // 输出: Hello, John
}

2.6 通道(Channel)

通道用于 Go 的并发编程中,用于在 goroutine 之间传递数据。它允许不同的 goroutine 之间安全地交换数据。

示例:

package main

import "fmt"

func main() {
    ch := make(chan string)

    go func() {
        ch <- "Hello from goroutine!"
    }()

    msg := <-ch
    fmt.Println(msg) // 输出: Hello from goroutine!
}


3. 类型转换

Go 语言提供了强类型系统,类型之间的转换需要显式操作。通过 T(x) 的形式将值从类型 x 转换为类型 T

示例:

package main

import "fmt"

func main() {
    var x int = 42
    var y float64 = float64(x) // 类型转换

    fmt.Println(x) // 输出: 42
    fmt.Println(y) // 输出: 42.0
}


4. 常量

常量是在程序运行时不会改变的值,常量的类型在声明时确定。常量使用 const 关键字声明。

示例:

package main

import "fmt"

const Pi = 3.14

func main() {
    fmt.Println(Pi) // 输出: 3.14
}


5. 参考资料


理解 Go 语言的各种数据类型是学习 Go 的基础之一,通过掌握这些类型,你可以更有效地组织和处理数据,编写高效、清晰的 Go 程序。