09 - 命名和声明

在 08 节,我们讨论了程序的结构, 接下来我们讨论变量命名方式

一、命名

go 语言中所有函数名、变量名、常量名,类型名、语句标号和包名等所有名字都遵循一个简单的命令规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。

go 语言中有 25 个关键字,类似于 C/C++ 中的 if else switch等语句:

break	| default	| func	| interface	| select
case	| defer		| go 	| map 		| struct 
chan	| else 		| goto 	| package	| switch
const 	| fallthrough| if	| range		| type
continue| for 		| import| return 	| var  

另外,在 go 当中还存在大量内部预定义的名字,例如 inttrue 等,还有一些主要的内部常量、类型和函数;他们不是关键字,但是他们在特定的场景中再定义并使用。
例如,在一个函数内部定义了一个名字,那么他就在函数内部有效, 这种类似于 C/C++ 中的 局部变量。而在函数外部定义的变量,我们可在当前包所有的文件中访问,类似于 C/C++ 中的 全局变量名字的开头字母的大小写决定了名字在包外的可见性
命名习惯: go中的名字一般以短小著称,优先推荐 驼峰式命名法, 对于名字中含有 html, ascii 的函数或者变量,一般对他们就是全程大小 xxHTML 或者 xxASCII
以下是常见的30多个预定义的名字:

内建常量: true false iota nil

内建类型: int int8 int16 int32 int64
          uint uint8 uint16 uint32 uint64 uintptr
          float32 float64 complex128 complex64
          bool byte rune string error

内建函数: make len cap new append copy close delete
          complex real imag
          panic recover

二、变量声明

1. var 声明

go 中主要有四种类型的声明语句: var、 const、type 和 func,分别对应 变量、常量、类型和函数。
变量声明,一般是在 var 后面加上一个名字,并且设置一个初始值:

 var 变量名 类型 = 初始值

其中的 “类型” 或者 “ = 初始值” 可以省略一个。在省略 “类型” 的时候, 程序将会根据表达之自动推导出类型的信息;当省略**“= 初始值”** 的时候,那么将会用零值对变量进行初始化, 所以在 go 语言当中不存在没有初始化的变量(布尔类型零值是 false, 而 字符串类型零值是空字符串,接口和引用类型(slice,map, chan 和 函数)对应的零值是 nil)

对于 string 类型变量,初始化后就是空字符串

var str string
fmt.Println(str) // ""

go 中还可以同时声明多个变量,在省略 “类型” 的情况下将会自动推导其变量类型:

var i, j, k int // int int int
var b, f, s = true, 2.3, "xiaomi"   // bool float64 string 
i, j, k = k, i, j // 多重赋值语言

我们也可以通过调用一个函数,有函数的返回值来初始化一组变量:

var f, err = os.Open(path) // *File error

2. 简短变量声明

go 语言还有一种简短变量声明的方式, 也是我们在 go 语言编程中使用最多的一种。 它以 “名字 := 初始值” 形式声明变量,变量的类型可以根据初始值自动推导。从中间发现了,var 形式的声明语法往往用于需要显式指定变量类型地方,或者因为变量稍后会被重新赋值而初始值无关紧要的地方。

i := 100 // int
var boiling float64 = 100// float 64

  
而简短变量声明语句也可以用函数的返回值来声明和初始化变量,像下面的os.Open函数调用将返回两个值:

f, err := os.Open(name)
if err != nil {
    return err
}
// ...use f...
f.Close()

  这里有一个比较微妙的地方:简短变量声明左边的变量可能并不是全部都是刚刚声明的。如果有一些已经在相同的词法域声明过了(§2.7),那么简短变量声明语句对这些已经声明过的变量就只有赋值行为了。

3. 简短变量声明的注意陷阱

在下面的代码中,第一个语句声明了in和err两个变量。在第二个语句只声明了out一个变量,然后对已经声明的err进行了赋值操作。

in, err := os.Open(infile)
// ...
out, err := os.Create(outfile)

简短变量声明语句中必须至少要声明一个新的变量,下面的代码将不能编译通过:

f, err := os.Open(infile)
// ...
f, err := os.Create(outfile) // compile error: no new 
// f, err = os.Create(outfile)   //改成 普通语句多重复值将不会出现 compile error

注意:简短变量声明语句中必须至少要声明一个新的变量,简短变量声明语句只有对已经在同级词法域声明过的变量才和赋值操作语句等价,如果变量是在外部词法域声明的,那么简短变量声明语句将会在当前词法域重新声明一个新的变量。

总结

  • 简短变量声明中的陷阱
  • 多重赋值语法
  • 包级变量的包外可见性原则
  • 熟悉 go 中的两种变量声明形式

猜你喜欢

转载自blog.csdn.net/xiaomiCJH/article/details/86414645
09