Go中基本数据类型共七类:bool、string、整型(int/int8…/uint64/uintptr)、浮点型(float32/float64)、复数型(complex64/complex128)、byte(uint8)、rune(int32),均直接存值、赋值传参时拷贝整个值、不共享底层内存。

Go里哪些类型算“基本数据类型”?
Go语言中,真正属于「基本类型」(也叫值类型)的只有这七类:bool、string、所有整型(int/int8/.../uint64/uintptr)、浮点型(float32/float64)、复数型(complex64/complex128)、byte(即uint8)、rune(即int32)。它们共同特点是:直接存值、赋值/传参时拷贝整个值、不共享底层内存。
容易混淆的是:slice、map、chan、func、interface{} 和指针(*T)——这些都不是基本类型,而是引用类型或复合类型,底层持有指针,传参不拷贝数据本身。
int、int64、uint8…到底该用哪个?
选错整数类型不会立刻报错,但会埋下溢出、跨平台兼容或内存浪费的隐患。核心原则是「按需最小化」:
-
uint8(别名byte)适合表示单个字节、ASCII字符、状态码(0–255),比如 HTTP 状态码200存成uint8就够了 -
int是最常用默认整型,但它的大小依赖系统(32位机为int32,64位机为int64),写跨平台库或序列化时尽量避免,改用明确位宽的int32或int64 -
uintptr只用于底层操作(如unsafe包指针运算),绝不能用来做普通计数——它不保证能和int互转,且在GC中行为特殊 - 用
unsafe.Sizeof(x)实时验证变量占多少字节,比如var x int = 1在64位系统上占8字节,不是4字节
string、[]byte、rune 三者怎么选?
字符串处理是Go新手最容易翻车的地方:
PHP是一种功能强大的网络程序设计语言,而且易学易用,移植性和可扩展性也都非常优秀,本书将为读者详细介绍PHP编程。 全书分为预备篇、开始篇和加速篇三大部分,共9章。预备篇主要介绍一些学习PHP语言的预备知识以及PHP运行平台的架设;开始篇则较为详细地向读者介绍PKP语言的基本语法和常用函数,以及用PHP如何对MySQL数据库进行操作;加速篇则通过对典型实例的介绍来使读者全面掌握PHP。 本书
立即学习“go语言免费学习笔记(深入)”;
-
string是只读的 UTF-8 字节序列,len(s)返回字节数,不是字符数;遍历for i, r := range s得到的是rune(Unicode 码点),不是byte - 要修改文本内容,必须先转成
[]byte(可变字节切片),改完再转回string;直接对string下标赋值会编译失败 -
rune不是“字符类型”,而是int32别名,用于安全表示一个 Unicode 字符(比如中文、emoji),len([]rune(s))才是真正的字符个数 - 误用
string[0]提取首字符?可能只拿到 UTF-8 编码的第一个字节(比如中文变成乱码),正确做法是[]rune(s)[0]或用strings.RuneCountInString
float32 和 float64 的精度坑怎么避?
浮点数不是数学实数,Go里尤其要注意默认行为:
-
float32有效数字约7位,float64约15位;金融计算、科学计算一律用float64,别图省那4字节 - 不要用
==直接比较两个浮点数是否相等,应判断差值是否小于 epsilon(如math.Abs(a-b) ) - 声明时没写类型,Go会按字面量推断:
var x = 3.14是float64,var y = 3.14e2也是float64;但var z float32 = 3.14会丢失精度(3.1400001) - 用
fmt.Printf("%f", x)输出时,默认显示6位小数,掩盖真实精度问题;调试建议用"%g"或"%.10g"查看实际值
最常被忽略的一点:Go没有隐式类型转换。哪怕只是把 int 加到 float64 上,也必须显式写成 float64(i) + f,否则编译直接报错——这不是限制,是防止意外精度丢失的设计守门员。









