04 | 程序实体

69 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

引言

上一秒你是个苹果,下一秒你就是数字,再下一秒你就可能是汽车

python是一门动态类型的编程语言,一切都是对象,能够直接进行相应操作,同一个变量名能够在运行过程中赋予不同类型的值。例如。由此,解释器在运行的时候有部分开销是在检查运行的内容是否符合当前操作。

a = "apple"
a = "chair"
a = Car() 

上一秒你是个苹果,无论什么时候,你都只能是苹果。

go是一门静态类型的编程语言,所以需要在声明变量或者常量的类型。或者给予足够的信息让编译器知道该变量或者常量是属于什么类型。例如,。

var a string
a = "apple" // 支持全局使用
a = 0 // cannot use 0 (untyped int constant) as string value in assignment
​
b := "apple" // 基于类型推断,只能在函数体内使用,便于代码重构
b = 1 // cannot use 1 (untyped int constant) as string value in assignmentvar c string = "apple"  // 支持全局使用
c = 2 // cannot use 2 (untyped int constant) as string value in assignment

程序实体

Go语⾔中的程序实体包括变量、常量、函数、结构体和接⼝。

代码块

⼀个程序实体的作⽤域总是会被限制在某个代码块中,⽽这个作⽤域最⼤的⽤处,就是对程序实体 的访问权限的控制

go语言的代码具有层级性,代码块一层套一层,一个代码块可以有若干个子代码块,但对于每个代码块,最多只有一个直接包含他的代码块,这样做间接的决定了程序实体的作用域。在python中使用相同缩进的代码视为同一代码块,而go中的代码块使用{}进行包裹。

对于一个变量与其外层代码块中的变量重名会发生什么呢?

package main
​
import "fmt"var block = "package"
func main(){
    block := "function"
    {
        block := "inner"
        fmt.Println("The block is " + block)
    }
    fmt.Println("The block is "+ block)
}

此处共有4个代码块,分别是:全局代码块、main包为代表的代码块、main函数代表的代码块,一级main函数中的一个用花括号包裹的代码块。

运行结果如下:

The block is inner.
The block is function.

虽有3处相同名称的变量,但是在运行过程中,内层会对外层的变量进行一个短暂的屏蔽作用。就像你看着远处的一个美女a,此时有一个美女b从你面前路过,眼中的美女就是b,等b走出视线,你眼中的美女又是a了