【Go语言基础【四】】局部变量、全局变量、形式参数

news2025/6/7 15:18:59

文章目录

    • 一、一句话总结
    • 二、作用域分类
      • 1. 局部变量(函数内/块内变量)
        • 1.1、语法说明
        • 1.2、示例
      • 2. 全局变量(包级变量)
        • 2.1、语法说明
        • 2.2、示例:全局变量的访问
      • 3. 形式参数(函数参数)
    • 三、作用域嵌套与变量查找规则
    • 四、注意事项

一、一句话总结

  • 局部变量:大括号内出生,大括号外死亡,子能看父,父不能看子
  • 全局变量:包内随处可见,大写可跨包,小写仅限当前包。
  • 同名变量:子作用域覆盖父作用域,就近原则优先。

 

二、作用域分类

1. 局部变量(函数内/块内变量)

1.1、语法说明
  • 定义位置:函数内部、if/for/switch 等语句块内。
  • 作用范围:仅在声明它的块内有效,块结束后变量被销毁。
  • 特点
    • 父作用域 不能访问子作用域的变量
    • 子作用域 可以访问父作用域的变量
    • 子作用域可声明与父作用域同名的变量,局部覆盖全局

 

1.2、示例

示例1:父作用域无法访问子作用域变量

func main() {
    { // 子作用域(块1)
        var localVar = "我是块1的变量" // 仅在块1内有效
        fmt.Println(localVar) // 输出:我是块1的变量
    }
    // fmt.Println(localVar) // 报错!块1外无法访问 localVar
}

 
示例2:子作用域访问父作用域变量

func main() {
    parentVar := "我是父作用域变量" // 父作用域(main函数)
    { // 子作用域(块2)
        fmt.Println(parentVar) // 可以访问,输出:我是父作用域变量
        var childVar = "我是块2的变量"
    }
    // fmt.Println(childVar) // 报错!块2外无法访问 childVar
}

 
示例3:局部变量覆盖全局变量

var globalVar = "全局变量" // 全局作用域

func main() {
    fmt.Println(globalVar) // 输出:全局变量
    { // 子作用域(块3)
        globalVar := "局部变量" // 与全局变量同名,局部覆盖全局
        fmt.Println(globalVar) // 输出:局部变量(仅块3内有效)
    }
    fmt.Println(globalVar) // 回到父作用域,输出:全局变量(未被修改)
}

 

2. 全局变量(包级变量)

2.1、语法说明
  • 定义位置:函数外部,直接在包(.go 文件)中声明。
  • 作用范围
    • 在当前包的所有函数中有效。
    • 若变量名首字母大写,可被其他包导入使用(Go 的包可见性规则)。
  • 特点
    • 全局变量相当于所有函数的“父作用域变量”,函数内部可直接访问。
    • 生命周期与程序一致(程序启动时创建,退出时销毁)。

 

2.2、示例:全局变量的访问
package main

import "fmt"

// 全局变量(首字母小写,仅限当前包使用)
var appName = "Go程序"

func printAppName() {
    fmt.Println("应用名称:", appName) // 函数内可直接访问全局变量
}

func main() {
    printAppName() // 输出:应用名称: Go程序
}

 

3. 形式参数(函数参数)

  • 定义位置:函数定义的参数列表中(如 func funcName(param int))。
  • 作用范围:仅在函数体内有效,相当于函数的“局部变量”。
  • 特点
    • 参数是函数的“输入变量”,调用时需传入对应值。
    • 不同函数的参数名可重复,互不影响。
func add(a, b int) int { // a、b 是形式参数(函数的局部变量)
    return a + b
}

func main() {
    var a = 10 // main函数的局部变量
    result := add(a, 20) // 传入值,函数内的a与main的a是不同变量
    fmt.Println(result) // 输出:30
}

 

三、作用域嵌套与变量查找规则

当变量在多层嵌套作用域中同名时,Go 会按以下规则查找:

  1. 先查当前作用域:是否有声明该变量?
  2. 再查外层作用域:从内到外,逐层向上查找,直到找到第一个声明的变量。
  3. 若全局作用域也没有:编译报错(变量未声明)。

示例:多层嵌套中的变量覆盖

var x = "全局x" // 全局变量

func main() {
    x := "main层x" // main函数的局部变量(覆盖全局x)
    fmt.Println(x) // 输出:main层x
    {
        x := "块内x" // 块内局部变量(覆盖 main层x)
        fmt.Println(x) // 输出:块内x
        {
            fmt.Println(x) // 输出:块内x(最近的声明)
        }
    }
    fmt.Println(x) // 输出:main层x(回到 main函数作用域)
}

 

四、注意事项

  1. 变量声明规则

    • 同一作用域内,变量不能重复声明(包括全局和局部)。
    • 未使用的变量会导致编译错误(Go 强制要求变量必须使用)。
  2. 包级作用域 vs 文件作用域

    • 全局变量的作用域是包级(整个包内可见),而非单个文件。
    • 不同文件属于同一包时,可共享全局变量(需注意包导入路径)。
  3. 避免滥用全局变量

    • 全局变量可能导致代码耦合度高、难以调试(如多个函数修改同一全局变量)。
    • 优先使用局部变量和函数参数,确保逻辑清晰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Web应用】若依框架:基础篇21二次开发-页面调整

文章目录 ⭐前言⭐一、课程讲解⭐二、怎样选择设计模式?🌟1、寻找合适的对象✨1) ⭐三、怎样使用设计模式?🌟1、寻找合适的对象✨1) ⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内…

【 java 基础知识 第一篇 】

目录 1.概念 1.1.java的特定有哪些? 1.2.java有哪些优势哪些劣势? 1.3.java为什么可以跨平台? 1.4JVM,JDK,JRE它们有什么区别? 1.5.编译型语言与解释型语言的区别? 2.数据类型 2.1.long与int类型可以互转吗&…

CVE-2020-17518源码分析与漏洞复现(Flink 路径遍历)

漏洞概述 漏洞名称:Apache Flink REST API 任意文件上传漏洞 漏洞编号:CVE-2020-17518 CVSS 评分:7.5 影响版本:Apache Flink 1.5.1 - 1.11.2 修复版本:≥ 1.11.3 或 ≥ 1.12.0 漏洞类型:路径遍历导致的任…

Excel表格批量下载 CyberWin Excel Doenlaoder 智能编程-——玄武芯辰

使用 CyberWin Excel Downloader 进行 Excel 表格及各种文档的批量下载,优势显著。它能大幅节省时间,一次性获取大量所需文档,无需逐个手动下载,提升工作效率。可确保数据完整性与准确性,避免因重复操作产生失误。还便…

可编辑PPT | 基于大数据中台新能源智能汽车应用解决方案汽车大数据分析与应用解决方案

这份文档是一份关于新能源智能汽车应用解决方案的详细资料,它深入探讨了智能汽车行业的发展趋势,指出汽车正从单纯交通工具转变为网络入口和智能设备,强调了车联网、自动驾驶、智能娱乐等技术的重要性。文档提出了一个基于大数据中台的车企数…

k8s集群安装坑点汇总

前言 由于使用最新的Rocky9.5,导致kubekey一键安装用不了,退回Rocky8麻烦机器都建好了,决定手动安装k8s,结果手动安装过程中遇到各种坑,这里记录下; k8s安装 k8s具体安装过程可自行搜索,或者deepseek; 也…

从 Stdio 到 HTTP SSE,在 APIPark 托管 MCP Server

MCP(Model Context Protocol,模型上下文协议) 是一种由 Anthropic 公司于 2024 年 11 月推出的开源通信协议,旨在标准化大型语言模型(LLM)与外部数据源和工具之间的交互。 它通过定义统一的接口和通信规则…

Mysql锁及其分类

目录 InnoDb锁Shared locks(读锁) 和 Exclusive locks(写锁)Exclusive locksShared locks Intention Locks(意向锁)为什么要有意向锁? Record Locks(行锁)Gap Locks(间隙锁)Next-Key LocksInsert Intention Locks(插入…

Postgresql源码(146)二进制文件格式分析

相关 Linux函数调用栈的实现原理(X86) 速查 # 查看elf头 readelf -h bin/postgres# 查看Section readelf -S bin/postgres (gdb) info file (gdb) maint info sections# 查看代码段汇编 disassemble 0x48e980 , 0x48e9b0 disassemble main# 查看代码段某…

【设计模式-4.11】行为型——解释器模式

说明:本文介绍行为型设计模式之一的解释器模式 定义 解释器模式(Interpreter Pattern)指给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。解释器模式是一种…

【已解决】MACOS M4 芯片使用 Docker Desktop 工具安装 MICROSOFT SQL SERVER

1. 环境准备 确认 Docker Desktop 配置 确保已安装 Docker Desktop for Mac (Apple Silicon)(版本 ≥ 4.15.0)。开启 Rosetta(默认开启): 打开 Docker Desktop → Settings → General → Virtual Machine Options …

Quipus系统的视频知识库的构建原理及使用

1 原理 VideoRag在LightRag基础上增加了对视频的处理,详细的分析参考LightRag的兄弟项目VideoRag系统分析-CSDN博客。 Quipus的底层的知识库的构建的核心流程与LightRag类似,但在技术栈的选择和处理有所不同。Quipus对于视频的处理实现,与Vi…

web3-去中心化金融深度剖析:DEX、AMM及兑换交易传播如何改变世界

web3-去中心化金融深度剖析:DEX、AMM及兑换交易传播如何改变世界 金融问题 1.个人投资:在不同的时间和可能的情况(状态)下积累财富 2.商业投资:为企业家和企业提供投资生产性活动的资源 目标:跨越时间和…

国芯思辰|SCS5501/5502芯片组打破技术壁垒,重构车载视频传输链路,兼容MAX9295A/MAX96717

在新能源汽车产业高速发展的背景下,电机控制、智能驾驶等系统对高精度信号处理与高速数据传输的需求持续攀升。 针对车载多摄像头与自动驾驶辅助系统对长距离、低误码率、高抗干扰性数据传输的需求,SCS5501串行器与SCS5502解串器芯片组充分利用了MIPI A…

压敏电阻的选型都要考虑哪些因素?同时注意事项都有哪些?

压敏电阻,英文名简称VDR,电子元器件中重要的成员之一,是一种非线性伏安特性的电阻器件,有电阻特性的同时,也拥有其他自身的特性,广泛应用于众多领域。在电源系统、安防系统、浪涌抑制器、电动机保护、汽车电…

用WPDRRC模型,构建企业安全防线

文章目录 前言什么是 WPDRRC 模型预警(Warning)保护(Protection)检测(Detection)响应(Response)恢复(Recovery)反击(Counterattack) W…

使用 Amazon Q Developer CLI 快速搭建各种场景的 Flink 数据同步管道

在 AI 和大数据时代,企业通常需要构建各种数据同步管道。例如,实时数仓实现从数据库到数据仓库或者数据湖的实时复制,为业务部门和决策团队分析提供数据结果和见解;再比如,NoSQL 游戏玩家数据,需要转换为 S…

Linux 里 su 和 sudo 命令这两个有什么不一样?

《小菜狗 Linux 操作系统快速入门笔记》目录: 《小菜狗 Linux 操作系统快速入门笔记》(01.0)文章导航目录【实时更新】 Linux 是一个多用户的操作系统。在 Linux 中,理论上来说,我们可以创建无数个用户,但…

JAVASCRIPT 简化版数据库--智能编程——仙盟创梦IDE

// 数据模型class 仙盟创梦数据DM {constructor(key) {this.key ${STORAGE_PREFIX}${key};this.data this.加载数据();}加载数据() {return JSON.parse(localStorage.getItem(this.key)) || [];}保存() {localStorage.setItem(this.key, JSON.stringify(this.data));}新增(it…

命名管道实现本地通信

目录 命名管道实现通信 命名管道通信头文件 创建命名管道mkfifo 删除命名管道unlink 构造函数 以读方式打开命名管道 以写方式打开命名管道 读操作 写操作 析构函数 服务端 客户端 运行结果 命名管道实现通信 命名管道通信头文件 #pragma#include <iostream> #include &l…