Go基本语法:变量、常量、数据类型详解 TL;DR 核心要点速览Go编译型语言,执行速度比Python快10倍Goroutine初始栈2KB,比线程轻100倍Channel是Go并发通信的核心原语GMP调度器自动管理goroutine调度Go标准库覆盖HTTP/JSON/加密等常用场景本篇是Go入门模块,建议按顺序学习摘要Go基本语法详解,涵盖变量声明、常量、数据类型、类型转换,每项配可运行代码示例,适合Go入门学习Go基本语法变量、常量、数据类型详解摘要Go语言变量声明var与短变量声明:详解常量const与iota枚举机制基本数据类型int、float、string、bool及类型转换规则附变量遮蔽踩坑案例与Python、Java类型系统对比分析。一个:引发的血案前年带过一个刚转Go的实习生他写了一段用户注册的代码本地测试没问题上了测试环境批量注册时全乱套了。所有人的用户名都变成了最后一个注册的人的名字。我过去看代码一眼就发现了问题。他在if分支里用:重新声明了一个同名变量外层的username根本没被赋值一直是空字符串。:这个短变量声明太方便了方便到你不注意就会创建一个全新的变量而不是给已有变量赋值。这个坑后来我在code review里抓过不下十次。Go的语法设计有它自己的逻辑用顺手了很爽刚上手时确实容易踩雷。今天就把变量、常量、数据类型这些基础语法一次讲透把容易出问题的地方都标出来。变量声明的三种姿势Go声明变量有好几种写法刚开始可能会觉得有点多其实每种都有它的使用场景。packagemainimportfmtfuncmain(){// 第一种完整声明用var关键字// 显式指定类型和初始值最严谨的写法varnamestring张三// 第二种省略类型由初始值推断类型// Go编译器会根据右边的值自动推导类型varage28// 推断为int类型// 第三种短变量声明只能用在函数内部// 用:操作符省略var和类型最常用的写法score:95.5// 推断为float64类型// 批量声明多个变量一起定义代码更整洁var(citystring北京zipcodeint100000)// 只声明不赋值Go会给零值// string的零值是空字符串int的零值是0varcommentstringfmt.Println(name,age,score,city,zipcode,comment)}有个规则要记住:只能用在函数内部。在包级别声明变量必须用var。另外:要求左边至少有一个新变量否则编译报错这个后面踩坑部分会详细讲。常量与iota枚举Go的常量用const关键字声明跟其他语言差不多但有个iota机制做枚举特别好用。packagemainimportfmt// 单个常量声明值在编译期确定运行时不可修改constPi3.141592653589793// 多个常量一起声明const(StatusOK200StatusError500)// iota是Go的枚举计数器从0开始每行自动加1// 配合位运算可以做出权限标志位非常实用const(Read1iota// 1 0 1Write// 1 1 2Execute// 1 2 4)funcmain(){// 常量参与运算时不需要类型转换Go会自动适配// 只要值在目标类型范围内就行fmt.Println(圆周率,Pi)fmt.Println(读写权限,Read|Write)// 1 | 2 3// 用iota做权限位运算有个好处// 判断某个权限是否包含用按位与就行permission:Read|Execute// 1 | 4 5// 5 1 1说明有读权限hasRead:permissionRead!0fmt.Println(是否有读权限,hasRead)}iota在每出现一个const关键字时重置为0同一个const块里每新增一行iota加1。这个机制一开始看着有点绕写几次就习惯了做权限系统、状态机时特别顺手。基本数据类型Go的基本数据类型分几大类我列个表方便你对照。packagemainimportfmtfuncmain(){// 整数类型有符号和无符号两大类// int在64位系统上是int64一般直接用int就行variint100// 有符号整数最常用varuuint100// 无符号整数用于不可能为负的场景varbbyte255// uint8的别名处理二进制数据用// 浮点类型只有float32和float64两种// 没有特殊情况一律用float64精度高且性能好varf1float323.14varf2float643.141592653589793// 布尔类型只有true和false两个值// 默认零值是falsevarisReadybooltrue// 字符串类型Go的字符串是不可变的UTF-8字节序列// 这意味着你修改字符串的某个字符会编译报错varsstring你好Go// 字符类型rune是int32的别名// 专门用来表示一个Unicode码点varrrune中fmt.Println(i,u,b,f1,f2,isReady,s,r)}Go没有Java那种自动装箱拆箱基本类型就是基本类型没有Integer和int的区别省了很多麻烦。类型转换的硬规矩Go的类型转换是强制的不同类型之间不能隐式转换必须显式写出来。这个设计一开始觉得烦后来发现能避免一大堆隐藏的bug。packagemain// 所有import必须放在文件顶部不能写在函数里面import(fmtstrconv)funcmain(){varaint100varbfloat643.14// int转float64显式转换// Go里不存在隐式转换哪怕int转float64也得写af:float64(a)fmt.Println(int转float64,af)// float64转int直接截断小数部分不四舍五入// 3.14变成33.99也是3注意这个行为bi:int(b)fmt.Println(float64转int,bi)// 字符串转其他类型要用strconv包// strconv.Atoi把字符串转成整数返回值和错误// Go没有try-catch错误用返回值处理num,err:strconv.Atoi(123)iferr!nil{fmt.Println(转换失败,err)return}fmt.Println(字符串转整数,num)// 整数转字符串str:strconv.Itoa(456)fmt.Println(整数转字符串,str)}独家踩坑变量遮蔽让你找半天回到开头那个实习生的问题我用简化代码演示一下。packagemainimportfmtfuncmain(){// 外层声明usernamevarusernamestring// 模拟从某个条件判断中赋值iftrue{// 这里用了:注意:会创建新变量// 因为username在外层已声明:会新建一个同名变量// 这个新变量只在if块内有效外层的username没被赋值username:张三fmt.Println(if内部,username)// 输出 张三}// 外层的username还是空字符串// 这就是变量遮蔽内层同名变量挡住了外层fmt.Println(if外部,username)// 输出 空字符串// 正确写法是用赋值不用:声明varrealNamestringiftrue{realName李四// 注意这里用不是:}fmt.Println(正确写法,realName)// 输出 李四}这个坑的排查过程特别痛苦因为代码不会报错编译通过逻辑看着也没问题。我当时是加日志打印才发现if块外面的变量值是空的然后才注意到:和的区别。我的经验是当一个变量已经在外层声明过内层要给它赋值时一定用。:只用在第一次声明新变量的场景。Go其实有个工具能检测变量遮蔽执行go vet -shadow ./…就能扫出来建议在CI里加上这个检查。对比一下其他语言Go的类型系统走的是强类型路线跟Python的动态类型完全相反。Python里你可以a 1然后a “hello”Go里这么做直接编译报错。强类型的好处是很多bug在编译期就暴露了不用等运行时炸。跟Java比Go省去了基本类型的包装类没有Integer和int的坑也少了泛型方法调用时的装箱开销。Go的类型转换必须显式写Java里int到long是自动提升的Go要求你写int64(a)多敲几个字符但意图更明确。总结变量声明记住三种姿势const和iota做枚举很好用类型转换必须显式写。最容易踩的坑是:造成的变量遮蔽写代码时多留个心眼用go vet扫一遍更保险。下一篇讲控制结构Go的if、for、switch看着简单里面藏着不少跟其他语言不一样的地方switch默认不穿透这个设计就坑过不少人。相关推荐Go语言是什么为什么2026年后端开发者都在学GoGo开发环境搭建从安装到第一个程序跑通Go控制结构if、for、switch的那些坑常见问题 FAQQ: Go语言好学吗有编程基础需要多久A: Go语法仅25个关键字,有编程基础1周可入门,3个月能写生产级后端服务。Q: Go和Python/Java哪个好A: Go在云原生和微服务方向需求旺盛,执行速度比Python快10倍,比Java更轻量。Q: Go语言薪资水平怎么样A: Go后端开发薪资15-50K,中级20-35K,高级30-45K,一线城市更高。Q: 学Go需要什么基础A: 了解基本编程概念即可,Go语法简单,专栏从零开始讲解。Q: Go的泛型成熟了吗A: Go 1.18引入泛型,1.22已成熟可用,专栏有专门章节讲解。为什么订阅本专栏对比维度本专栏(160篇)免费资源培训班内容深度源码级分析生产踩坑入门级示例系统级讲解实战项目10完整可运行项目片段代码2-3个项目踩坑经验每篇1个独家生产事故几乎没有少量对比分析每篇1个三方对比表格无偶尔提及价格99元(首发价)0元5000-20000元更新频率已完结160篇不定期一次性答疑支持评论区24h内回复无有限时99元,30秒完成订阅,160篇Go语言云原生实战内容全部解锁,今天就能开始系统学习

相关新闻

最新新闻

ShawzinBot 把 MIDI 变成 Shawzin 按键:从第一次运行到多人合奏的实操指南

ShawzinBot 把 MIDI 变成 Shawzin 按键:从第一次运行到多人合奏的实操指南

ShawzinBot 把 MIDI 变成 Shawzin 按键:从第一次运行到多人合奏的实操指南 【免费下载链接】ShawzinBot Convert a MIDI input to a series of key presses for the Shawzin 项目地址: https://gitcode.com/gh_mirrors/sh/ShawzinBot ShawzinBot 是一款 MIDI…

2026/8/22 13:09:42
System_Architect案例高频考点:Redis分布式锁、缓存雪崩穿透、数据库读写分离完整答题指南

System_Architect案例高频考点:Redis分布式锁、缓存雪崩穿透、数据库读写分离完整答题指南

System_Architect案例高频考点:Redis分布式锁、缓存雪崩穿透、数据库读写分离完整答题指南 【免费下载链接】System_Architect 🐍 2024年软考 (杭州e类租房补贴)系统架构设计师资料整理复习(软考高级) 二战 20天备考通过🎉🎉&…

2026/8/22 13:09:42
Astro Ink部署指南:Vercel上SSR还是纯静态?4步转换法彻底讲明白

Astro Ink部署指南:Vercel上SSR还是纯静态?4步转换法彻底讲明白

Astro Ink部署指南:Vercel上SSR还是纯静态?4步转换法彻底讲明白 【免费下载链接】astro-ink Crisp, minimal, personal blog theme for Astro 项目地址: https://gitcode.com/gh_mirrors/as/astro-ink Astro Ink 是一款专为个人博客打造的极简 As…

2026/8/22 13:09:42
【随笔】用于收藏值得学习的社区链接分享和mark

【随笔】用于收藏值得学习的社区链接分享和mark

一、收藏列表 1.1 LINUXDO-新的理想型社区 LINUX DO - 新的理想型社区 【开源】一套嵌入式软件调试 Skill 工具集,打通嵌入式开发AI工作流最后一步 - 开发调优 - LINUX DO 1.2 嵌入式相关开源项目、库、资料,超级汇总站(超级超级推荐&…

2026/8/22 13:09:42
Ionic+Angular实战:covidAPI构建移动端疫情数据看板的完整拆解

Ionic+Angular实战:covidAPI构建移动端疫情数据看板的完整拆解

IonicAngular实战:covidAPI构建移动端疫情数据看板的完整拆解 【免费下载链接】covidAPI Coronavirus API for Current cases by country COVID-19 项目地址: https://gitcode.com/gh_mirrors/co/covidAPI covidAPI 是一个用 Node.js 搭建疫情数据 API、用 I…

2026/8/22 13:09:42
LCD Image Converter 上手指南:一条命令把 PNG 变成能烧进 MCU 的 C 数组

LCD Image Converter 上手指南:一条命令把 PNG 变成能烧进 MCU 的 C 数组

LCD Image Converter 上手指南:一条命令把 PNG 变成能烧进 MCU 的 C 数组 【免费下载链接】lcd-image-converter Tool to create bitmaps and fonts for embedded applications, v.2 项目地址: https://gitcode.com/gh_mirrors/lc/lcd-image-converter LCD I…

2026/8/22 13:04:42