Go语言变量的作用域

2021-10-22

每一个变量(常量、类型或函数)在程序中都有一定的作用范围。称之为作用域。

Go语言在编译时会检查每一个变量是否使用过,未使用过的变量就会编译错误。

根据变量定义位置的不同,可以分为以下三个类型:

在函数体内被声明的变量称之为局部变量,作用在函数体内,函数的参数和返回值变量都属于局部变量。局部变量不会一直存在,在函数被调用时存在,函数调用结束后变量就会被销毁,即生命周期。

例子:其中a、b均为局部变量,只会在main函数内有效

在函数体外被声明的变量称之为全局变量,作用于所有源文件。不包含这个全局变量的源文件需要使用"import"关键字引入全局变量所在的源文件之后才能使用这个全局变量。

全局变量声明必须以 var 关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。

例如:global为全局在main2和main函数中都能使用

函数名后面的小括号里定义的变量, 用于接受来自调用函数的参数。用于接收调用该函数时传入的参数。

例如:下面的例子中,第十七行a、b为sum函数定义的形参,用于传入main函数中的AF、BF

Golang 公共变量包——expvar

expvar 包是 Golang 官方提供的公共变量包,它可以辅助调试全局变量。支持一些常见的类型: float64 、 int64 、 Map 、 String 。如果我们的程序要用到上面提的四种类型(其中,Map 类型要求 Key 是字符串)。可以考虑使用这个包。

这些基础的功能就不多说了,大家可以直接看官方的 文档 。

看源码的时候发现一个非常有意思的调试接口, /debug/vars 会把所有注册的变量打印到接口里面。这个接口很有情怀。

感觉这个包还是针对简单变量,比如整形、字符串这种比较好用。

看到就写了,并没有什么沉淀,写得挺乱的。这个包很简单,但是里面还是有些可以借鉴的编码和设计。新版本的 Golang 已经能解析整形为 Key 的哈希表了,这个包啥时候能跟上支持一下?

go语言语法(基础语法篇)

import "workname/packetfolder"

导入多个包

方法调用 包名.函数//不是函数或结构体所处文件或文件夹名

packagename.Func()

前面加个点表示省略调用,那么调用该模块里面的函数,可以不用写模块名称了:

当导入一个包时,该包下的文件里所有init()函数都会被执行,然而,有些时候我们并不需要把整个包都导入进来,仅仅是是希望它执行init()函数而已。下划线的作用仅仅是为了调用init()函数,所以无法通过包名来调用包中的其他函数

import _ package

变量声明必须要使用否则会报错。

全局变量运行声明但不使用。

func 函数名 (参数1,参数2,...) (返回值a 类型a, 返回值b 类型b,...)

func 函数名 (参数1,参数2,...) (返回值类型1, 返回值类型2,...)

func (this *结构体名) 函数名(参数 string) (返回值类型1, 返回值类型2){}

使用大小来区分函数可见性

大写是public类型

小写是private类型

func prifunc int{}

func pubfunc int{}

声明静态变量

const value int

定义变量

var value int

声明一般类型、接口和结构体

声明函数

func function () int{}

go里面所有的空值对应如下

通道类型

内建函数 new 用来分配内存,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配类型零值的指针

func new(Type) *Type

[这位博主有非常详细的分析]

Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。

goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。

同一个程序中的所有 goroutine 共享同一个地址空间。

语法格式如下:

通道(channel)是用来传递数据的一个数据结构。

通道的声明

通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 - 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。

[这里有比较详细的用例]

go里面的空接口可以指代任何类型(无论是变量还是函数)

声明空接口

go里面的的强制类型转换语法为:

int(data)

如果是接口类型的强制转成其他类型的语法为:

go里面的强制转换是将值复制过去,所以在数据量的时候有比较高的运行代价

go语言中的var关键字是声明变量还是定义+初始化变量

定义+初始化。

举个例子

var num int //定义一个整形变量num,默认为0

var number int = 21 //定义一个整型变量number,并赋值为21

go语言中全局变量和局部变量的区别

局部变量

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

以下实例中 main() 函数使用了局部变量 a, b, c:

package main

import "fmt"

func main() {

/* 声明局部变量 */

var a, b, c int

/* 初始化参数 */

a = 10

b = 20

c = a + b

fmt.Printf ("结果: a = %d, b = %d and c = %d\n", a, b, c)

}

以上实例执行输出结果为:

结果: a = 10, b = 20 and c = 30

全局变量

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

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

package main

import "fmt"

/* 声明全局变量 */

var g int

func main() {

/* 声明局部变量 */

var a, b int

/* 初始化参数 */

a = 10

b = 20

g = a + b

fmt.Printf("结果: a = %d, b = %d and g = %d\n", a, b, g)

}

以上实例执行输出结果为:

结果: a = 10, b = 20 and g = 30

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

package main

import "fmt"

/* 声明全局变量 */

var g int = 20

func main() {

/* 声明局部变量 */

var g int = 10

fmt.Printf ("结果: g = %d\n", g)

}

以上实例执行输出结果为:

结果: g = 10