作用域
go语言一共有如下几个作用域:
- 全局作用域:所有的关键字和内置类型、函数都拥有全局作用域
- package作用域:一个包中声明的变量、常量、函数、类型等都拥有包作用域,在同一个包中可以任意访问
- 文件作用域:一个文件中通过import导入的包名,只在当前文件有效
- 函数作用域以及for、if、{}自定义作用域,函数的参数、reciever、返回值都拥有函数作用域,for、if、{}内部的变量只拥有最小作用域。
同一作用域的符号不能重名
声明
label
go语言也支持label,可以向C/C++一样通过goto跳转到指定label。
同时go的break和continue还是指定label来跳出或继续不通的循环层级。
空标记
空标记_
仅仅是一个占位符,通过将函数返回值赋值给空标记,可以避免编译器提示未使用的变量。
导出符号
一个包中的导出符号可以在包的外部被访问,只有满足一下条件的符号才是导出符号
- 符号名首字母大写
- 属于包作用域或者是一个首字母大写的类型的成员
常量声明和iota
常量声明可以有类型和没有类型,无类型常量的精度至少满足如下条件
- 整数常量不少于256位
- 浮点常量尾数不少于256位且指数不少于32位(最新的1.8好像改成了16位)
常量声明使用关键字const
const a int32 = 123 //有类型常量,32位
const b = 102934810923801238 //无类型常量 不少于256位
可以使用声明列表和iota来实现类型C的enum的功能
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Partyday
numberOfDays
)
这里面涉及两个规则:
1、在常量列表中,如果一行省略了赋值,则默认使用上一行的结果
2、iota是go的内置常量,他会在常量列表中每行递增
同时iota将会在每一个常量列表中清零即:
const (
a = iota // = 0
b // = 1
)
const (
c = iota // = 0
)
类型声明
类型声明使用type关键字
type IntArray [16]int //same as c/c++的typedef
type ( //类型声明也支持列表形式
Int32 int32
Int64 int64
)
type Reader interface { //interface
Read() []byte
}
type TreeNode struct { //struct
left, right *TreeNode
value interface{}
}
一个类型声明不会继承任何的基本类型的方法集合
// A Mutex is a data type with two methods, Lock and Unlock.
type Mutex struct { /* Mutex fields */ }
func (m *Mutex) Lock() { /* Lock implementation */ }
func (m *Mutex) Unlock() { /* Unlock implementation */ }
// NewMutex has the same composition as Mutex but its method set is empty.
type NewMutex Mutex
// The method set of the base type of PtrMutex remains unchanged,
// but the method set of PtrMutex is empty.
type PtrMutex *Mutex
// The method set of *PrintableMutex contains the methods
// Lock and Unlock bound to its anonymous field Mutex.
type PrintableMutex struct {
Mutex
}
// MyBlock is an interface type that has the same method set as Block.
type MyBlock Block
变量声明
类型声明有两种方式,var类型声明和短类型声明:=
var类型声明
这种类型声明可以在任何需要声明变量的地方出现
var a int32 = 1
var a = 1
var (
a = 1
b = "string"
c = 1.0
)
短类型声明
短类型声明只能出现在函数体中
a := []byte{}
a := make([]byte, 10)
a := 5
短类型声明在一下情况可以重复声明
- 多赋值
- 多赋值中除了
_
外至少有一个新的变量 - 重复声明的变量类型不能改变
a := 1
a, b := 1, 2 //ok
c, a := 1, 2.0 //not ok, type diffrent
a, b := 1, 2 //not ok, no new variable
函数声明和方法声明
函数声明使用func关键字,方法就是拥有receiver的函数
func function(param int) (int, bool) //函数
func (r int32) method(param int) (int, bool) //方法
函数可以有多返回值,具体的细节go语言基本数据类型中有描述