Go强制类型安全,int与int64不可隐式转换;跨平台用int32/int64;包级变量必须var;string操作需注意UTF-8字节与字符区别;浮点比较须用误差容忍。
Go 的数据类型不是“选一个就行”,而是“选错一个就卡住编译”——它强制你从第一行变量声明起就面对类型安全。
为什么 int 和 int64 不能混用?
Go 不做任何隐式转换,哪怕只是 int 和 int64 这种“看起来一样”的整数类型,也属于完全不同的类型。比如传参给期望 int64 的函数时传了 int,会直接报错:cannot use x (type int) as type int64 in argument。
- 平台相关性:
int在 32 位系统是 32 位,在 64 位系统是 64 位,跨平台序列化或 RPC 时极易出错 - 网络/存储场景必须用定宽类型:
int32或int64,否则 JSON 解码可能失败或截断 - 循环索引、局部计数器可用
int;但涉及时间戳、ID、文件大小等,一律优先写明int64
:= 声明 vs var 声明:什么时候该停手?
:= 看似方便,但它只在函数内部有效,且要求右侧值能明确推导类型;而 var 是唯一能用于包级变量、接口字段、延迟赋值的正统方式。
- 包级变量必须用
var:var port int = 8080✅;port := 8080❌(编译错误) - 需要先声明后赋值(比如 err 变量常在 if 分支中才赋值):
var err error✅;err := someFunc()可能造成重复声明 - 批量配置项建议用
var ()块:var ( timeout = 30 * time.Second debug = true ),可读性强、支持注释、类型可选
字符串操作最常踩的三个坑
Go 的 string 是不可变的 UTF-8 字节序列,不是字符数组。看似简单的 len(s) 或 s[0],背后全是陷阱。