02 Go 变量与类型学习笔记

📅 2026/8/11 6:14:17
02 Go 变量与类型学习笔记
Go 变量与类型学习笔记1. var 声明变量Go 使用var关键字声明变量可以指定类型或让编译器推断packagemainimportfmtfuncmain(){varmessageHello Variables!fmt.Println(message)}执行结果Hello Variables!要点var message Hello Variables!— 省略类型时编译器根据右值自动推断类型此处推断为stringvar message string Hello Variables!— 显式指定类型var message string— 只声明不赋值变量获得零值空字符串var声明可在函数内或函数外使用包级别2. 短变量声明::是 Go 最常用的变量声明方式只能在函数内部使用packagemainimportfmtfuncmain(){count:42fmt.Printf(Count: %d\n,count)}执行结果Count: 42要点:同时完成声明和赋值编译器自动推断类型此处推断为int:只能在函数内部使用不能用于包级别变量:左侧必须至少有一个新变量否则应使用赋值对比varvar count 42等价于count : 42但:更简洁3. 批量声明变量var 分组多个变量可以用var()分组声明更清晰packagemainimportfmtfuncmain(){var(nameAliceage30cityBoston)fmt.Printf(Name: %s, Age: %d, City: %s\n,name,age,city)}执行结果Name: Alice, Age: 30, City: Boston要点var()分组写法适合声明多个相关变量代码更整洁每个变量仍可以单独指定类型或省略类型让编译器推断包级别变量也常用分组写法var(globalNameGoglobalAge10)4. 类型推断Type Inference当变量声明时省略类型Go 编译器根据右值自动推断packagemainimportfmtfuncmain(){language:Goversion:1.21isActive:truefmt.Printf(Language: %s %.2f, Active: %t\n,language,version,isActive)}执行结果Language: Go 1.21, Active: true要点language : Go→ 推断为stringversion : 1.21→ 推断为float64Go 中浮点数字面值默认是float64不是float32isActive : true→ 推断为bool如果需要特定类型如float32必须显式声明var version float32 1.215. 零值Zero ValuesGo 中声明变量但不赋值时变量自动获得该类型的零值packagemainimportfmtfuncmain(){varnamestringvarcountintvaractiveboolvarpricefloat64fmt.Printf(String: %s, Int: %d, Bool: %t, Float: %.1f\n,name,count,active,price)}执行结果String: , Int: 0, Bool: false, Float: 0.0要点各类型的零值string→空字符串int→0bool→falsefloat64→0.0指针、切片、映射、通道、接口、函数 →nilGo 没有未初始化变量的概念变量总是有确定的值这避免了 C 语言中未初始化变量带来的安全隐患6. 常量Constants常量用const声明值在编译时确定运行时不可修改packagemainimportfmtconstPI3.14159constAppNameGoForGofuncmain(){fmt.Printf(App: %s, PI: %.5f\n,AppName,PI)}执行结果App: GoForGo, PI: 3.14159要点const声明的值不可修改尝试修改会编译报错常量不能用:声明常量的值必须在编译时就能确定不能是函数返回值等运行时结果常量也可以分组声明const(PI3.14159AppNameGoForGo)特殊常量iota用于生成递增枚举值const(Sundayiota// 0Monday// 1Tuesday// 2)7. Go 基本类型Go 提供丰富的内置类型变量声明时显式指定类型packagemainimportfmtfuncmain(){varnamestringGovarversionfloat641.21varisOpenbooltruevarusersint1000000fmt.Printf(Language: %s %.2f, Open: %t, Users: %d\n,name,version,isOpen,users)}执行结果Language: Go 1.21, Open: true, Users: 1000000要点Go 的基本类型类别类型整数int,int8,int16,int32,int64,uint,uint8…uint64浮点float32,float64布尔bool字符串string字符byteuint8 的别名runeint32 的别名表示 Unicode 字符复数complex64,complex128int在 64 位系统上是 64 位32 位系统上是 32 位float64是默认浮点类型精度比float32更高显式指定类型时var name string Go和var name Go推断效果相同8. 类型转换Type ConversionGo 不支持隐式类型转换所有跨类型转换必须显式进行packagemainimport(fmtstrconv)funcmain(){// These variables have different typesvarnumberint42varpifloat643.14159varmessagestring123floatNumber:float64(number)intPi:int(pi)convertedNumber,_:strconv.Atoi(message)fmt.Printf(Float: %.2f, Int: %d, Converted: %d\n,floatNumber,intPi,convertedNumber)}执行结果Float: 42.00, Int: 3, Converted: 123要点数值类型之间的转换float64(number)把int转float64int(pi)把float64转intint(pi)截断小数部分3.14159 → 3不是四舍五入字符串与数值的转换需要strconv包strconv.Atoi(123)→ 字符串转整数返回(int, error)strconv.Itoa(123)→ 整数转字符串strconv.ParseFloat(3.14, 64)→ 字符串转浮点数strconv.FormatFloat(3.14, f, 2, 64)→ 浮点数转字符串Go 不允许隐式转换var f float64 42编译报错必须写var f float64 float64(42)convertedNumber, _ : strconv.Atoi(message)中_忽略了可能的错误实际代码中应处理 error9. 变量作用域Variable Scope变量的可见范围取决于声明位置包级别 函数级别 块级别packagemainimportfmtvarglobalMessageGlobalfuncmain(){localMessage:Local// This will create a new scopeiftrue{blockMessage:Blockfmt.Printf(%s %s %s\n,globalMessage,localMessage,blockMessage)}// blockMessage is not accessible herefmt.Printf(%s %s\n,globalMessage,localMessage)}执行结果Global Local Block Global Local要点三层作用域包级别在所有函数外声明var globalMessage Global整个包内可见函数级别在函数内声明localMessage : Local该函数内可见块级别在if、for、switch等代码块内声明blockMessage : Block只在该块内可见内层作用域可以访问外层变量块内可以访问 local 和 global外层作用域不能访问内层变量函数外不能访问 blockMessageif true是一个永远为真的条件仅用于演示块作用域知识点总结知识点关键概念var 声明var name value可在函数内外使用可指定或省略类型短变量声明name : value只能在函数内使用自动推断类型批量声明var ()分组声明多个变量更整洁类型推断省略类型时编译器根据右值推断浮点默认float64零值未赋值的变量自动获得零值string→, int→0, bool→false, float→0.0常量const声明不可修改编译时确定支持iota枚举基本类型int/float/bool/string/rune/byte无隐式转换类型转换必须显式转换float64(i)、int(f)字符串与数值用strconv包变量作用域包级 函数级 块级内层可见外层外层不可见内层