Go 语言变量、常量、运算符一、Go 变量1.1 变量命名规则说明合法/非法示例1.2 变量声明四大方式方式1标准声明var 变量名 类型语法说明零值规则重点示例运行结果踩坑方式2声明并初始化var 变量名 类型 值语法示例方式3类型推断省略类型编译器自动识别语法说明示例方式4短变量声明:最常用语法说明示例踩坑高频错误1.3 多变量声明1. 同行声明多个同类型变量2. 同行声明多个不同类型变量类型推断3. 因式分解写法推荐全局变量语法示例4. 短变量多变量声明函数内1.4 变量作用域示例1.5 空白标识符 _说明语法示例踩坑1.6 值类型 引用类型1. 值类型示例2. 引用类型二、Go 常量2.1 常量基础语法说明基础语法示例踩坑2.2 多常量声明1. 同行多常量2. 因式分解批量常量常用枚举场景2.3 常量与内置函数示例2.4 特殊常量iota枚举计数器核心规则用法1基础自增用法2穿插自定义值打断自增用法3位运算结合 iota经典场景踩坑三、Go 运算符3.1 算术运算符完整示例高频踩坑3.2 关系运算符比较运算符示例踩坑3.3 逻辑运算符示例3.4 位运算符示例3.5 赋值运算符示例3.6 其他运算符地址 指针示例3.7 运算符优先级示例括号改变优先级一、Go 变量变量用于存储数据可读写、运行过程中值可修改。Go 是静态强类型语言变量必须先声明再使用。1.1 变量命名规则说明由字母、数字、下划线_组成首字符不能是数字不能使用 Go 关键字作为变量名区分大小写见名知意推荐驼峰命名。合法/非法示例合法name、_age、userID、num123非法123abc数字开头、ab含特殊符号、case关键字1.2 变量声明四大方式方式1标准声明var 变量名 类型语法var变量名 数据类型说明只声明、不初始化变量会自动赋予零值。零值规则重点数值类型int/float0布尔类型false字符串空字符串指针、切片、map、channel、函数、errornil示例packagemainimportfmtfuncmain(){varaintvarbfloat64varcboolvardstringfmt.Printf(a%d, b%f, c%t, d%q\n,a,b,c,d)}运行结果a0, b0.000000, cfalse, d踩坑只声明不赋值的局部变量必须使用否则编译报错declared but not used全局变量允许声明不使用。方式2声明并初始化var 变量名 类型 值语法var变量名 类型值示例packagemainimportfmtfuncmain(){varnamestring张三varageint20fmt.Println(name,age)}方式3类型推断省略类型编译器自动识别语法var变量名值说明根据右侧值自动推导变量类型日常使用频率很高。示例packagemainimportfmtfuncmain(){varstrGo语言varnum100fmt.Println(str,num)}方式4短变量声明:最常用语法变量名:值说明等价于var 变量名 类型 值只能在函数内部使用不能声明全局变量必须同时声明赋值不能只声明不赋值。示例packagemainimportfmtfuncmain(){msg:短变量声明fmt.Println(msg)}踩坑高频错误同一作用域不能重复用:声明同名变量funcmain(){a:10a:20// 报错no new variables on left side of :}修正直接赋值a 20。:不能用于全局变量msg:全局变量// 语法报错修正全局变量使用var声明。1.3 多变量声明1. 同行声明多个同类型变量varv1,v2,v3 类型varv1,v2,v3 类型值1,值2,值3示例vara,bint1,2fmt.Println(a,b)2. 同行声明多个不同类型变量类型推断varv1,v2值1,值2示例varname,age李四,22fmt.Println(name,age)3. 因式分解写法推荐全局变量批量声明多个不同类型全局变量代码整洁。语法var(变量1类型值1变量2类型值2变量3值3)示例packagemainimportfmt// 全局变量组var(idint1addrstring北京flagtrue)funcmain(){fmt.Println(id,addr,flag)}4. 短变量多变量声明函数内v1,v2:值1,值2示例funcmain(){x,y:10,testfmt.Println(x,y)}1.4 变量作用域局部变量函数/代码块内声明仅当前代码块有效函数执行完毕自动销毁。全局变量函数外声明整个包内有效首字母大写可跨包访问。变量重名局部变量和全局变量可以同名局部变量优先就近原则。示例packagemainimportfmt// 全局变量varnumint100funcmain(){// 局部变量覆盖全局varnumint200fmt.Println(num)// 输出 200}1.5 空白标识符_说明_是只写变量用于丢弃不需要的返回值解决 Go 变量必须被使用的规则。语法_,变量返回值1,返回值2示例packagemainimportfmt// 函数返回两个值funccalc()(int,int){return10,20}funcmain(){// 丢弃第一个返回值只接收第二个_,b:calc()fmt.Println(b)// 20}踩坑不能读取_的值fmt.Println(_)直接编译报错。1.6 值类型 引用类型1. 值类型包含int、float、bool、string、数组特点赋值时完整拷贝数据新旧变量互不影响变量存储在栈内存。示例a:10b:a b20fmt.Println(a)// 10a 不受影响2. 引用类型包含切片、map、指针、channel、函数特点赋值时只拷贝内存地址多个变量指向同一份数据修改一个全部受影响。二、Go 常量常量是程序运行期间值固定不可修改的量使用const声明。2.1 常量基础语法说明常量只能修饰布尔、数值、字符串类型声明时必须赋值无零值概念不能使用:声明常量。基础语法// 显式指定类型const常量名 类型值// 类型推断省略类型推荐const常量名值示例packagemainimportfmtfuncmain(){constPIfloat643.14159constNAMEGo学习fmt.Println(PI,NAME)}踩坑常量声明后禁止修改如下代码直接编译报错consta10a20// 报错cannot assign to a2.2 多常量声明1. 同行多常量constc1,c2值1,值22. 因式分解批量常量常用枚举场景const(常量1值1常量2值2常量3值3)示例简单枚举const(UNKNOWN0MALE1FEMALE2)2.3 常量与内置函数常量表达式中可以使用Go 内置函数len、cap、unsafe.Sizeof普通自定义函数不支持。示例packagemainimport(fmtunsafe)const(strhellollen(str)sunsafe.Sizeof(str))funcmain(){fmt.Println(str,l,s)}2.4 特殊常量iota枚举计数器核心规则iota是常量组专用计数器const关键字出现时iota重置为0常量组内每新增一行iota自动 1上一行常量无赋值时默认继承上一行表达式。用法1基础自增packagemainimportfmtconst(aiota// 0b// 1继承 a iotac// 2)funcmain(){fmt.Println(a,b,c)// 0 1 2}用法2穿插自定义值打断自增const(aiota// 0b// 1dha// 自定义值iota1 → 2e// haiota1 → 3f100// 自定义值iota1 → 4g// 100iota1 → 5hiota// 5)用法3位运算结合 iota经典场景packagemainimportfmtconst(i1iota// 1 0 1j3iota// 3 1 6k// 3 2 12l// 3 3 24)funcmain(){fmt.Println(i,j,k,l)// 1 6 12 24}踩坑iota仅在const常量组内生效单独使用无效普通变量不能使用iota。三、Go 运算符运算符用于数据运算、逻辑判断分为算术、关系、逻辑、位、赋值、其他运算符同时包含优先级规则。3.1 算术运算符适用于数值类型共 7 个。运算符作用示例(A10,B20)相加AB 30-相减A-B -10*相乘A*B 200/整除B/A 2%取余B%A 0自增A → 11--自减A-- → 9完整示例packagemainimportfmtfuncmain(){vara21varb10fmt.Println(ab)fmt.Println(a-b)fmt.Println(a*b)fmt.Println(a/b)fmt.Println(a%b)afmt.Println(a)a--fmt.Println(a)}高频踩坑整数相除结果为整数小数部分直接舍弃5 / 2 2自增/自减只能单独使用不能参与赋值运算a:10b:a// 编译报错Go 不支持取余%不能用于浮点类型。3.2 关系运算符比较运算符返回结果为bool类型true/false常用于if/for判断。运算符作用相等!不相等大于小于大于等于小于等于示例packagemainimportfmtfuncmain(){a:21b:10ifab{fmt.Println(相等)}else{fmt.Println(不相等)}fmt.Println(ab)}踩坑判断相等是不要写成赋值。3.3 逻辑运算符多用于多条件组合判断操作数和结果均为布尔值。运算符名称规则逻辑与两边都为 true结果才为 true短路左边 false 直接终止!逻辑非取反true → falsefalse → true示例packagemainimportfmtfuncmain(){a:trueb:falsefmt.Println(ab)// falsefmt.Println(a||b)// truefmt.Println(!a)// false}3.4 位运算符对整数二进制位进行操作底层开发、权限掩码常用。假定a60(0011 1100)b13(0000 1101)运算符作用结果按位与对应位都为1才为1 → 12按位或^按位异或对应位不同则为1 → 49左移 n 位整体左移低位补0 → a2 240右移 n 位整体右移高位补0 → a2 15示例packagemainimportfmtfuncmain(){varauint60varbuint13fmt.Println(ab)fmt.Println(a|b)fmt.Println(a^b)fmt.Println(a2)fmt.Println(a2)}3.5 赋值运算符结合运算 赋值简化代码写法。运算符等价写法基础赋值a a b-a a - b*a a * b/a a / b%a a % b左移后赋值右移后赋值按位与后赋值^按位异或后赋值示例packagemainimportfmtfuncmain(){a:10a5// a 10 5fmt.Println(a)a*2fmt.Println(a)}3.6 其他运算符地址 指针运算符作用取变量内存地址*解引用取指针指向的值示例packagemainimportfmtfuncmain(){a:4varptr*int// 定义指针变量ptra// 取 a 的地址赋值给指针fmt.Println(a 的地址,ptr)fmt.Println(a 的值,*ptr)// 通过指针取值}3.7 运算符优先级优先级由高到低同优先级从左向右运算括号()优先级最高可手动改变运算顺序。* / % ^ - | ^ ! ||示例括号改变优先级packagemainimportfmtfuncmain(){a,b,c,d:20,10,15,5e:(ab)*c/d fmt.Println(e)}