以下笔记摘录自『 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
tags: Vuejs 作用域插槽 <slot> 内容在父模板编译,基於 Vue 的定义...
(1) VSCode https://code.visualstudio.com/download ...
var 为全域变数,超不谨慎,宣告变数後值可被改变,也可以重复宣告。 let 为区域变数,较谨慎,...
什麽是 Facade Pattern? 实作不依赖多个类别,而是依赖介面,并把这些类别实作在此介面 ...
「哇,原来研究室是这样的啊。」诗忆东张西望。 「是呀,这里是大家办公的地方,实验的机器不在这里,所以...