Go语言中线程安全的内置数据类型包括:int、uint、float32、float64、complex64、complex128、byte、rune、uintptr,这些数据类型不可变,因此线程安全;而非线程安全的数据类型包括map、slice、channel、interface、pointer、struct,因其可变性,需同步机制保护。

Go 语言中线程安全的内置数据类型
Go 语言提供了以下内置数据类型,它们在并发环境中是线程安全的:
- int(有符号整数)
- uint(无符号整数)
- float32(32 位浮点数)
- float64(64 位浮点数)
- complex64(64 位复数)
- complex128(128 位复数)
- byte(8 位无符号整数,用于表示字节)
- rune(32 位无符号整数,用于表示 Unicode 字符)
- uintptr(平台特定类型的无符号整数,用于存储指针)
为什么这些数据类型是线程安全的?
这些数据类型是线程安全的,因为它们是不可变的。这意味着一旦被创建,就不能再修改它们。如果有多个 goroutine 同时访问这些数据类型,则可以保证它们将看到相同的值。
立即学习“go语言免费学习笔记(深入)”;
非线程安全的数据类型
以下数据类型在 Go 语言中不是线程安全的:
- map(存储键值对的哈希表)
- slice(表示数组的一部分)
- channel(用于在 goroutine 之间通信)
- interface(用于表示不同类型的值)
- pointer(存储变量地址)
- struct(包含多个域的复合数据类型)
这些数据类型不是线程安全的,因为它们是可变的。这意味着多个 goroutine 可以同时修改这些数据类型,从而导致数据损坏。因此,在并发环境中必须使用同步机制(如互斥锁)来保护这些数据类型。










