惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
D
DataBreaches.Net
博客园 - 三生石上(FineUI控件)
博客园_首页
T
Tailwind CSS Blog
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
云风的 BLOG
云风的 BLOG
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 聂微东
S
SegmentFault 最新的问题
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
N
Netflix TechBlog - Medium
Jina AI
Jina AI
WordPress大学
WordPress大学
U
Unit 42
J
Java Code Geeks
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Cloudflare Blog

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解
Go语言中的变量:全局变量-局部变量-短变量-匿名变量
何人陪我共长生 · 2026-04-30 · via 博客园_首页

变量

Go语言中的每一个变量都有自己的类型,并且变量必须经过声明才能开始使用。
声明的变量必须使用,否则会报错。这一点与js不相同。

GO语言中变量的声明

Go语言变量名由字母、数字、下划线组成(3种字符),其中首个字符不能为数字。
Go语言中关键字和保留字都不能用作变量名。[重要]
Go语言中的变量需要声明后才能使用,同一作用域内不支持重复声明。
并且Go语言的变量声明后必须使用(这一点和js不相同)。

如何声明变量

var 变量名称 类型

变量声明后没有赋值的话,值为空

package main
// 引入打印的包
import ("fmt")
// 入口函数
func main()  {
	// 输出语句
	var userName string
	fmt.Println("userName", userName) // 值是空
}

image

第一种方式去初始化(定义变量和赋值分为2步)

package main
// 引入打印的包
import ("fmt")
// 入口函数
func main()  {
	// 第一种方式初始化变量
	var userName string
	userName ="张三"
	fmt.Println(userName)
}

第2种方式定义变量(定义变量和赋值合并成为1步)

package main
// 引入打印的包
import ("fmt")
// 入口函数
func main()  {
	// 第2种方式初始化变量:定义变量和赋值合并成为1步
	var userName string ="张三"
	fmt.Println(userName)
}

第3种方式:自动推导类型,不需要你去声明类型

package main
// 引入打印的包
import ("fmt")
// 入口函数
func main()  {
	// 第3种方式:自动推导类型,不需要你去声明类型
	var userName ="张三"
	fmt.Println(userName)
}

一次性定义多个变量

// 第一种,这种变量名称1,变量名称2类型是相同的
var变量名称1,变量名称2 类型

// 第二种:变量名称1,变量名称2 类型不相同
var (
  变量名称1 类型
  变量名称2 类型
)
package main
import ("fmt")
// 入口函数
func main()  { 
   // 第二种:变量名称1,变量名称2 类型不相同
	var (
	  userName string = "张三"
	  ageNum int =19
	)
	fmt.Println(userName, ageNum)
}

输出 张三 19

go语言可以自动推导数据类型,你声明变量且赋值的时,可以不用写数据类型

比如上面的例子,你声明变量的时候,有赋值。
因此。可以不用去写变量类型。
它回去自动推导

import ("fmt")
// 入口函数
func main()  {
// 声明变量且赋值的时,可以不用写数据类型
	var (
		userName  = "张三"
		ageNum  =19
	)
	fmt.Println(userName, ageNum)
}

短变量声明法

在函数内部,可以使用更简略的 := 方式声明并初始化变量。
注意:短变量只能用于声明局部变量,不能用于全局变量的声明。

变量 := 赋值

注意 := 左右两侧有空格

package main
import ("fmt")
// 入口函数
func main()  {
	// 短变量声明法
	userName := "张三" // 等价与 var userName = "张三"
	fmt.Println(userName)
}

短变量一次声明多个变量

package main
import ("fmt")
// 入口函数
func main()  {
	// 声明变量且赋值的时,可以不用写数据类型
	userName,ageNum,userAddress:= "张三", 18, "在xx城市"
	fmt.Println(userName, ageNum, userAddress)
}

全局变量、短变量只能声明局部变量

package main
import ("fmt")
// 声明了一个全局变量且有赋值。不用声明类型
var g="全局变量"
// 入口函数
func main()  {
	// 声明变量且赋值的时,可以不用写数据类型
	userName,ageNum,userAddress:= "张三", 18, "在xx城市"
	fmt.Println("短变量只能声明局部变量",userName, ageNum, userAddress)
	fmt.Println(g)
}

匿名变量

匿名变量在使用多重赋值时,
如果想要忽略某个值,可以使用匿名变量(anonymous variable)
匿名变量用一个下划线_表示
匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明
也就是说:下划线_不存在重复声明

package main
import ("fmt")

func backInfo()(string, int){
	return "zhangsan", 100
}

// 入口函数
func main()  {
	//获取全部变量
	var userName,age = backInfo()
	fmt.Println(userName, age)
	// 假设现在我们不需要返回值 age,使用匿名变量
    var name, _ =backInfo()
	fmt.Println(name)
	// 匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明
	var _, ccc =backInfo()
	fmt.Println(ccc)
}