Go 语言变量作用域

作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。

Go 语言中变量可以在三个地方声明:

  1. 函数内部定义的变量称为局部变量
  2. 函数外部定义的变量称为全局变量
  3. 函数定义中传的变量称为形式参数

局部变量

在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。

栗子~

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func plus() int{
  8. //声明并初始化局部变量num1,num2
  9. num1 := 10
  10. num2 := 20
  11. sum := num1 + num2
  12. //和作为返回值返回
  13. return sum
  14. }
  15.  
  16. func main(){
  17. //调用plus函数并输出返回的结果
  18. fmt.Println(plus())
  19. /*这个执行会报错undefined: num1,因为这个num1的作用域在plus函数内,所以main函数是无法调用的
  20. fmt.Println(num1)
  21. */
  22. }

全局变量

在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用。

全局变量可以在任何函数中使用,以下实例演示了如何使用全局变量:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. var (
  8. //定义全局变量num1,numu2
  9. num1 int = 10
  10. num2 int = 20
  11. )
  12. func plus() int {
  13. fmt.Println("plus函数内部调用num1:", num1)
  14. fmt.Println("plus函数内部调用num2:", num2)
  15. sum := num1 + num2
  16. //和作为返回值返回
  17. return sum
  18. }
  19.  
  20. func main(){
  21. fmt.Println("plus函数返回的结果为:",plus())
  22. fmt.Println("------------------------")
  23. fmt.Println("main函数中调用num1:",num1)
  24. fmt.Println("main函数中调用num2:",num2)
  25. }

以上代码输出的返回结果为:

  1. plus函数内部调用num1: 10
  2. plus函数内部调用num2: 20
  3. plus函数返回的结果为: 30
  4. ------------------------
  5. main函数中调用num1: 10
  6. main函数中调用num2: 20

Go 语言程序中全局变量与局部变量名称可以相同,但是函数内的局部变量会被优先考虑。实例如下:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. var (
  8. //定义全局变量num1,numu2
  9. num1 int = 10
  10. num2 int = 20
  11. )
  12. func plus() int {
  13. //内部的局部变量num1作用域要高于外部的num1.计算的时候会使用局部变量计算
  14. num1 := 50
  15. fmt.Println("plus函数内部调用num1:", num1)
  16. fmt.Println("plus函数内部调用num2:", num2)
  17. sum := num1 + num2
  18. //和作为返回值返回
  19. return sum
  20. }
  21.  
  22. func main(){
  23. fmt.Println("plus函数返回的结果为:",plus())
  24. fmt.Println("------------------------")
  25. fmt.Println("main函数中调用num1:",num1)
  26. fmt.Println("main函数中调用num2:",num2)
  27. }

以上代码输出的返回结果为:

  1. plus函数内部调用num1: 50
  2. plus函数内部调用num2: 20
  3. plus函数返回的结果为: 70
  4. ------------------------
  5. main函数中调用num1: 10
  6. main函数中调用num2: 20

形式参数

形式参数会作为函数的局部变量来使用。实例如下:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. //声明全局变量a
  8. var a int = 20
  9.  
  10. func main(){
  11. //局部变量
  12. var a int = 10
  13. var b int = 20
  14. var c int = 0
  15.  
  16. fmt.Println("main函数中的a值:", a)
  17. c = plus(a, b)
  18. fmt.Println("main函数中的c值:", c)
  19.  
  20. }
  21.  
  22. func plus(a, b int) int {
  23. //形参a,b的值来自于main函数中的局部变量的a,b两个赋值
  24. fmt.Println("plus函数内部的a值:", a)
  25. fmt.Println("plus函数内部的b值:", b)
  26. return a + b
  27. }

以上代码输出的返回结果为:

  1. main函数中的a值: 10
  2. plus函数内部的a值: 10
  3. plus函数内部的b值: 20
  4. main函数中的c值: 30

Go的变量作用域的更多相关文章

  1. javascript中的变量作用域以及变量提升

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...

  2. [转]深入理解JavaScript的变量作用域

    1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在整个函数中都有定义. 5.未使用var关键字定 ...

  3. Java基础知识笔记(七:接口、变量作用域和参数传递)

    一.接口 Java语言不允许一个子类拥有多个直接父类,即任何子类只能有一个直接父类.但允许一个类实现多个接口,即在定义类的接口名称列表中可以包含1个或多个接口名称,从而实现多重继承的特性.接口的定义格 ...

  4. PHP常量、变量作用域详解(一)

    PHP 中的每个变量都有一个针对它的作用域,它是指可以在其中访问变量(从而访问它的值)的一个领域.对于初学者来说,变量的作用域是它们所驻留的页面.因此, 如果你定义了 $var,页面余下部分就可以访问 ...

  5. PHP变量作用域详解(二)

    学过C的人用PHP的时候一般会相当顺手,而且感到PHP太方便太轻松.但在变量作用域这方面却与C有不同的地方,搞不好会相当郁闷,就找不到错误所在.昨晚就与到这么一个问题,是全局变量在函数中的问题.今天搜 ...

  6. JavaScript函数定义和调用 变量作用域

     本文是笔者在看廖雪峰老师JavaScript教程时的个人总结   JavaScript中函数定义可以是这样的格式 function 函数名(参数) {     函数体 } 也可以是这样的格式     ...

  7. JavaScript 变量作用域

    一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...

  8. 变量作用域&函数作用域

    一. 变量作用域 1)全局变量 在全局环境下声明的变量被视为全局变量. 在没有使用var进行声明的时候,变量就被定义为全局变量.在ES5的严格模式下,如果变量没有使用var来声明是会报错的. 2)局部 ...

  9. OC点语法和变量作用域

    OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: #import <Foundation/Foundation.h> @interface Person : ...

  10. python的变量作用域问题

    偶然掉进了一个坑里.仔细分析了下原因.原来是变量作用域的问题.简单抽象如下: id=1 #许多行代码 [id for id in range(10)] #许多行代码 if id!=1: #做一些事情 ...

随机推荐

  1. SpringEL 表达式错误记录

    原因暂时未知....

  2. python学习笔记之运算符

    目录 前言 软件环境 身份运算符 算术运算符 比较运算符 位移运算符 自变运算符 位运算符 逻辑运算符 成员关系运算符 Python真值表 最后 前言 在前面的博文介绍了Python的数据结构之后,接 ...

  3. json和xml封装数据、数据缓存到文件中

    一.APP的通信格式之xml xml:扩展标记语言,可以用来标记数据,定义数据类型,是一种允许用户对自己标记语言进行定义的源语言.XML格式统一,扩平台语言,非常适合数据传输和通信,业界公认的标准. ...

  4. C# Web.config配置

    使用 <!--M002 バッチを起動のPath配置--> <add key="BM0002_START_PATH" value="D:\BM0002\B ...

  5. GET请求和POST请求的区别

    request获取请求参数 最为常见的客户端传递参数方式有两种: 浏览器地址栏直接输入:一定是GET请求: 超链接:一定是GET请求: 表单:可以是GET,也可以是POST,这取决与<form& ...

  6. docker~为什么没人说说.dockerignore

    回到目录 最近一直专注于docker的开发之中,而在使用Dockerfile时发现有个问题,当你的发布目录只能是obj\Docker\publish,而指向其它目录dockefile并不认它,只有如何 ...

  7. 51nod_1040:最大公约数之和(数论)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 给出一个n,求1-n这n个数,同n的最大公约数的和. ...

  8. python之总体理解

    作为脚本,python具备了弱类型语言的灵活性,便捷性.这在日常的开发使用中能够大幅度的减轻开发人员的编码负担,开发者也能够将精力集中在程序的逻辑管理和总体构架设计上.一般而言,随着经验的积累,开发人 ...

  9. Jsoup教程jsoup开发指南,jsoup中文使用手册,jsoup中文文档

    jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据. jsou ...

  10. 唠一唠Linux系统入门的方法和经验

    相信大伙都听说过linux系统,然而对于这个系统,总使让新手感觉茫然,偌大的系统.下面是一段百度中的介绍: Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用 ...