[Day 8] -『 GO语言学习笔记』- 列举(enums) & 变数作用范围(Scope)

以下笔记摘录自『 The Go Workshop 』。

列举

列举是一种定义一系列常数的方式,常数是整数且彼此相关。Go虽然没有内建列举专用的型别,但提供了一种称为iota的工具供使用。

For example,

const (
    Sunday = 0
    Monday = 1
    Tuseday = 2
    ...
    Saturday = 6
)

使用iota可以协助管理以上的常数清单,使列举清单更容易建立、修改。

const (
    Sunday = iota
    Monday
    Tuseday
    ...
    Saturday
)

变数作用范围

所有变数都有其运作范围(或称层级、作用域)。最上层的范围是套件(package)范围。

变数范围的上下层关系在编译程序时就决定好,不是等到执行阶段才决定。当某段程序码存取某个变数时,Go语言会检查该程序码的作用范围。范围内找不到该名称,就会往上一层范围找,一直找到最顶层的套件范围为止。途中找到同名变数,Go就会停止搜寻,并使用那个变数,但若到顶端还是找不到,就会抛出错误。

package main

import "fmt"

var level = "pkg"

func main() {
	fmt.Println("Main start  :", level) //main()层级
	if true {
		fmt.Println("Block start :", level) //底下if层级
		funcA()
	}
}

func funcA() {
	fmt.Println("funcA start :", level) //funcA()层级
}

变数遮蔽

因为Go语言一找到变数,Go就会停止搜寻,并使用那个变数,所以导致遮蔽现象

package main

import "fmt"

var level = "pkg"

func main() {
	fmt.Println("Main start  :", level)

	level := 42
	if true {
		fmt.Println("Block start :", level)
		funcA()
	}
	fmt.Println("Main end    :", level)
}

func funcA() {
	fmt.Println("funcA start :", level)
}

输出:

Main start  : pkg
Block start : 42
funcA start : pkg
Main end    : 42

由以上可得出,子范围的level变数『遮蔽』了套件范围的level变数。
其中特别注意的是,当我们呼叫funcA()时,Go语言动用了静态范围解析,他不会管funcA()在哪里被呼叫,因此funcA()仍是套件层级的level变数!


<<:  【Day 9】梯度下降法(Gradient Descent) --- Tip 2, 3

>>:  Day 7 - 神奇的工具 Cloud-Init

Vue slot:作用域插槽、具名插槽的缩写

tags: Vuejs 作用域插槽 <slot> 内容在父模板编译,基於 Vue 的定义...

Day 12 - var 、let、const

var 为全域变数,超不谨慎,宣告变数後值可被改变,也可以重复宣告。 let 为区域变数,较谨慎,...

DAY 23:Facade Pattern,由统一的入口介面来做事

什麽是 Facade Pattern? 实作不依赖多个类别,而是依赖介面,并把这些类别实作在此介面 ...

在程序里避开踩雷:安全引用空虚值、例外处理和延後、惰性初始化 Null Safety, Exception, lateinit, lazy

「哇,原来研究室是这样的啊。」诗忆东张西望。 「是呀,这里是大家办公的地方,实验的机器不在这里,所以...