当前位置: 首页 > 后端技术 > Python

18.理解Go语言中的语句块和作用域

时间:2023-03-26 00:15:25 Python

大家好,我是明哥。自学Golang的那段时间,我写了详细的学习笔记,放在了我的个人微信上公众号《Go编程时光》。我也是Go语言的初学者,所以我写的应该更适合刚入门的人。如果你刚开始学习Go语言,不妨关注一下,一起学习成长。我的在线博客:http://golang.iswbm.com我的Github:github.com/iswbm/GolangCodingTime因为Go使用词法作用域,而词法作用域依赖于语句块。所以在讲scope的时候,需要了解一下Go中什么是statementblock?1.显示语句块和隐式语句块通俗地说,语句块就是用花括号({})括起来的一系列语句。不能从块外部访问在语句块内声明的名称。此块确定内部声明的名称的范围或作用域。花括号括起来的语句块是显示语句块。Go中有很多隐式语句块:Main语句块:包含所有源代码,对应内置scopepackage语句块:包含包中的所有源代码(一个包可能包含一个目录下的多个文件),对应包-levelscope文件语句块:包括文件中的所有源代码,对应的file-levelscopefor,if,switch等语句也在各自的隐式语句块中,前三点对应的是localscope很容易理解,第四点举了几个例子for循环完成后,变量ifori:=0;我<5;i++{fmt.Println(i)}if语句判断后,变量iifi不能再使用了:=0;i>=0{fmt.Println(i)}switch语句结束后,就是变量isswitchi:=2;i*4{case8:fmt.Println(i)default:fmt.Println("default")}并且每个switch语句的子句是一个隐式语句块switchi:=2;i*4{case8:j:=0fmt.Println(i,j)default://"j"isundefinedherefmt.Println("default")}//"j"isundefinedhere2.理解变量的四种作用域的声明,除了要声明它的类型外,还要注意声明的位置,由不同的位置决定,说白了就是我的变量,哪里可用,哪里可用不是。根据声明位??置的不同,作用域可以分为以下四种:内置作用域:无需自己声明,所有关键字、内置类型、函数都有全局作用域包级作用域:必须在函数外声明,在包内的所有文件都可以访问文件级范围:不需要声明,导入是。通过文件import导入的包名只在文件中有效。局部作用域:在自己的语句块中声明,包括functions、for、if等语句块,或者自定义{}语句块组成的作用域,以上四种作用域只能在自己的局部作用域内使用,从上到下,作用域从大到小,为了表达方便,这里我把作用域大的作用域称为高层作用域,作用域小的作用域称为下层作用域。关于作用域,有如下结论:低级作用域可以访问与高级作用域同级的作用域,在隔离的低级作用域声明的变量会覆盖在高级作用域声明的变量。级范围。此处注意一方面,不要将作用域与生命周期混淆。声明语句的范围对应于源代码的文本区域;它是一个编译时属性。变量的生命周期是指变量在程序运行时存在的有效时间段,在这个时区内可以被程序的其他部分引用;这是一个运行时的概念。3.静态作用域和动态作用域根据变量在局部作用域中的可见性,是否为静态,编程语言可以分为以下两种:静态作用域,如Go语言动态作用域,如Shell语言具体是什么是动态作用域,这里用Shell代码演示一下,你就知道了#!/bin/bashfunc01(){localvalue=1func02}func02(){echo"func02seesvalueas${value}"}#Execute从函数func01func02的代码可以看出,在func01函数中定义了一个局部变量值。按理说这个值变量只有在这个函数中才有,但是因为在shell中作用域是动态的,所以在func01中也是有的。当func02可以被调用时,func02就可以访问value变量,此时func02的作用域可以看作是局部作用域(func01)的局部作用域。但如果脱离func01的执行环境,放在全局环境或其他函数中,func02就无法访问value变量。所以此时的输出是func02seesvalueas1func02seesvalueas,但是Go中不存在这种动态作用域。比如这段代码中,在func01函数中,如果要获取变量名,只能从func01中获取。作用域或更高级别的作用域(文件级作用域、包级作用域和内置作用域),但不是来自调用它的另一个本地作用域(因为它们属于层次结构中的同一级别)。import"fmt"funcfunc01(){fmt.Println("在func01函数中,name:",name)}funcmain(){varnamestring="Python编程时间"fmt.Println("在main函数中,name:",name)func01()}所以执行这段代码的时候会报错,提示func01中的name还没有定义。参考文章:https://studygolang.com/artic...系列指南01.搭建开发环境(Goland&VSCode)02.学习创建变量的五种方式03.数据类型详解:整型和浮点型04.详细数据类型:byte、rune和string05。详细数据类型:array和slice06。详细数据类型:字典和布尔类型07。详细数据类型:pointer08。面向对象编程:结构和继承09.一篇文章了解Go10中的函数。Go语言流程控制:if-else条件语句11.Go语言流程控制:switch-case选择语句12.Go语言流程控制:for循环语句13.Go语言流控:goto无条件跳转14.Go语言流控:defer延迟调用15.面向对象编程:接口与多态16.关键词:make和new的区别?17.一篇理解Go18中语句块和作用域的文章。学习Go协程:goroutine19。学习Go协程:channels/channels20详解。通道死锁的几个经典错误案例详解21。学习Go协程:WaitGroup22。学习Go协程:互斥锁和读写锁23。Go中的异常处理:panic和recover24。超详细解读GoModules的前世今生和入门使用25。Go语言包导入的八个必学知识Point26.如何将自己写的模块开源给别人使用?27.说说Go语言中的类型断言?28.这五点带你看懂Go语言中select的使用