Go语言中的类型

Go语言是一种静态类型的编程语言,这意味着每个变量和表达式在编译时都有确定的类型。Go提供了丰富的内置类型,包括基本数据类型、复合数据类型和引用类型等。本文将详细介绍Go中的各种类型,并提供实例说明。

基本数据类型

布尔型(bool)

布尔型有两个可能的值:truefalse。它们是未类型的布尔值。

go 复制代码
var isTrue bool = true
var isFalse bool = false

整数型

Go提供了不同大小的整数类型,包括有符号和无符号整数。

  • 无符号整数类型:uint8, uint16, uint32, uint64
  • 有符号整数类型:int8, int16, int32, int64
go 复制代码
var u8 uint8 = 255
var i8 int8 = -128

浮点型

浮点型包括单精度和双精度浮点数。

  • float32:IEEE 754 32位浮点数
  • float64:IEEE 754 64位浮点数
go 复制代码
var f32 float32 = 3.14
var f64 float64 = 3.1415926

复数型

Go还支持复数类型,包括单精度和双精度。

  • complex64:实部和虚部都是float32
  • complex128:实部和虚部都是float64
go 复制代码
var c64 complex64 = complex(3, 4)
var c128 complex128 = complex(3.1415926, 2.71828)

字符串型(string)

字符串是由8位字节组成的不可变序列,通常用于表示UTF-8编码的文本。

go 复制代码
var str string = "Hello, Go!"

复合数据类型

数组(array)

数组是固定长度的相同类型元素的序列。

go 复制代码
var arr [5]int = [5]int{1, 2, 3, 4, 5}

切片(slice)

切片是对数组的抽象,提供了可变长度的序列。

go 复制代码
var slice []int = make([]int, 5)
copy(slice, arr[:])

映射(map)

映射是键值对的集合,键必须是可比较的类型。

go 复制代码
var m map[string]int = map[string]int{"one": 1, "two": 2}

通道(channel)

通道用于在不同的goroutine之间安全地传递数据。

go 复制代码
var ch chan int = make(chan int)
go func() {
    ch <- 42
}()
v := <-ch

引用类型

指针(pointer)

指针存储了某个变量的内存地址。

go 复制代码
var i int = 42
var p *int = &i

接口(interface)

接口是一组方法的集合,任何实现了这些方法的类型都实现了该接口。

go 复制代码
type Reader interface {
    Read(p []byte) (n int, err error)
}

结构体(struct)

结构体是字段的集合,字段可以是不同的类型。

go 复制代码
type Point struct {
    X, Y float64
}
var p Point
p.X = 1.0
p.Y = 2.0

特殊类型

空类型(nil)

nil是指针、通道、函数、接口、映射、切片的零值。

go 复制代码
var p *int = nil

错误类型(error)

error是一个内建的接口类型,用于表示错误。

go 复制代码
var err error = nil

任意类型(any)

anyinterface{}的别名,可以存储任何类型的值。

go 复制代码
var v any = "Hello"
fmt.Println(v)

可比较类型(comparable)

comparable是一个内建的接口,所有可比较的类型都实现了这个接口。

实例演示

下面是一个简单的实例,演示了如何在Go中使用这些类型。

go 复制代码
package main

import (
    "fmt"
    "math"
)

func main() {
    // 基本数据类型
    var isTrue bool = true
    var i8 int8 = -128
    var u16 uint16 = 65535
    var f64 float64 = 3.1415926
    var c128 complex128 = complex(3.1415926, 2.71828)
    var str string = "Hello, Go!"

    // 复合数据类型
    var arr [3]int = [3]int{1, 2, 3}
    var slice []int = arr[1:]
    var m map[string]int = map[string]int{"one": 1, "two": 2}
    var ch chan int = make(chan int)
    go func() {
        ch <- 42
    }()
    v := <-ch

    // 引用类型
    var p *int = new(int)
    *p = 42

    // 特殊类型
    var err error = nil
    var vAny any = "Hello, any type!"

    // 打印结果
    fmt.Printf("isTrue: %v, i8: %v, u16: %v, f64: %v, c128: %v, str: %v\n", isTrue, i8, u16, f64, c128, str)
    fmt.Printf("slice: %v, m: %v, v: %v, p: %v, err: %v, vAny: %v\n", slice, m, v, *p, err, vAny)
}

这个实例展示了Go中各种类型的声明和使用方式。通过这个实例,你可以更好地理解Go的类型系统。

相关推荐
Pedantic1 小时前
SwiftUI 手势层级(Gesture Hierarchy)详解
前端
飘尘2 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
一颗烂土豆2 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl
浏览器工程师3 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
雨季mo浅忆3 小时前
VSCode自动格式化三要素
前端
爱勇宝4 小时前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员
kyriewen4 小时前
同事每天催我 Code Review,我写了个脚本让 AI 替我 review PR——现在他反过来催 AI 了
前端·javascript·ai编程
user20585561518136 小时前
Windows 项目安装时报 `node-sass` 错误,如何快速处理
前端
LiaCode6 小时前
Redis 在生产项目的使用
前端·后端