Golang 程序结构
关键字
go中含有25个关键字
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
此外,还有大约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
名字大小写
大写的名字表明是可导出的,即可被其它包访问,如fmt包中的Println 小写的名字只能在包内使用
名字长度
一般名字的长度是没有限制的。 Go提倡短小的名称,如表示索引,定义为i,而不是index等 当作用域范围较大或生命周期较长的变量,采用较长的名字可能会更好。
声明
主要有4种类型的声明语句:
- var(变量)
var 变量名字 类型 = 表达式
如果省略var和类型,根据初始化表达式来推导变量的类型信息
如果省略'=表达式’信息,则自动按类型对应的'0’值初始化
- 数值类型变量对应的零值是0
- 布尔类型变量对应的零值是false
- 字符串类型对应的零值是空字符串
- 接口或引用类型(包括slice、map、chan和函数)变量对应的零值是nil
- 数组或结构体等聚合类型对应零值是每个元素或字段都是对应该类型的零值
- Go语言中不存在未初始化的变量
var a = 1.2
var b = (a + 1) * (a - 1)
var c
d := c * a
i, j := 0, 1
i, j = j, i
- const(常量)
- 声明单个变量
const MAX = 1024
- 声明一组变量
const (
first = 1 << 1
second = 1 << 2
)
- type(类型) type 类型名字 底层类型
type Stu struct {
name string
age int
}
type Celsius float64 // 摄氏温度
type Fahrenheit float64 // 华氏温度
const (
AbsoluteZeroC Celsius = -273.15 // 绝对零度
FreezingC Celsius = 0 // 结冰点温度
BoilingC Celsius = 100 // 沸水温度
)
- func(函数)
Go推崇”一件事情有且只有一种方法完成”的思想
func max(x, y int) int {
if x > y {
return x
}
return y
}
指针
- 每个变量都有内存地址,指针即变量的地址
- 指针的零值为nil
x := 1
p := &x // p, of type *int, points to x
fmt.Println(*p) // "1"
*p = 2 // equivalent to x = 2
fmt.Println(x) // "2"
- 返回函数中局部变量的地址也是安全的, 因为指针仍然引用这个变量
var p = f()
func f() *int {
v := 1
return &v
}
- new 函数
p := new(int)
func newInt() *int {
return new(int)
}
//等价于
func newInt() *int {
var dummy int
return &dummy
}
包和文件
- Go语言中的包和其他语言的库或模块的概念类似,目的都是为了支持模块化、封装、单独编译和代码重用。
- 一个包的源代码保存在一个或多个以.go为文件后缀名的源文件中,通常一个包所在目录路径的后缀是包的导入路径。
- 每个源文件中可以添加一个init函数,在多次引用时,只执行一次调用
作用域
if x := f(); x == 0 {
fmt.Println(x)
} else if y := g(x); x == y {
fmt.Println(x, y)
} else {
fmt.Println(x, y)
}
fmt.Println(x, y) // compile error: x and y are not visible here