这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
Go语言的命名规范
Unicode字符, 数字和下划线
不能以数字开头, 只能是下划线或者字母
Go语言关键字
声明数据类型关键字
struct func interface map chan
函数调用控制关键字
defer go
流程控制语句
if else
switch case fallthrough default
for range
select
break continue return goto
包的管理和库的导入关键字
package import
变量和常量的声明关键字
var const
定义类型的关键字
type
变量的定义
多个变量的定义
// 多个变量分开定义
// 一般定义局部变量
var b bool
var i int;
var f float64
var s string
var pi *int
// 多个变量集中定义
// 一般用于定义全局变量
var (
b bool
i int
f float64
s string
pi *int
)
// 注: 当然这两种方式, 全凭个人喜好的, 没有硬性要求
// 打印每个变量未赋值状态时的零值
fmt.Println("布尔类型的零值", b)
fmt.Println("整型类型的零值", i)
fmt.Println("浮点类型的零值", f)
fmt.Println("字符串类型的零值", s)
fmt.Println("指针类型的零值", pi)
/*
在Go中变量一经定义, 就会对他们进行初始化, 设置为默认的零值
布尔类型的零值 false
整型类型的零值 0
浮点类型的零值 0
字符串类型的零值 (字符串的零值是一个空字符串)
指针类型的零值 <nil>
*/
多个变量的赋值
// 多个变量分开赋值
b = true
i = 2
f = 3.14
s = "shaosiming"
pi = &i
// 多个变量的平行赋值
// = 左边的值要与右边的变量一一对应
b, i, f, s, pi = true, 2, 3.14, "shaosiming", &i
变量的定义与赋值
// 单个变量的定义与赋值
name := "shaosiming"
age := 18
// 多个变量的定义与平行赋值
// := 左边的值要与右边的变量一一对应
tel, addr := "1234567", "北京欢乐谷"
fmt.Println("姓名: ", name)
fmt.Println("年龄: ", age)
fmt.Println("电话: ", tel)
fmt.Println("地址: ", addr)
// 注: := 也称为简式声明
:= 的注意事项
/*
首先定义了x, 并赋值为3
当我们使用 := 进行平行赋值时, := 左侧必须有新的变量被定义
如果像这样
x := 3
x := 5
这样是不可以的
*/
// 而像下面这样, 是可以的
x := 3
x, y := 5, 7
fmt.Println(x, y)
忽略标识符 _
func main()
// 如果只是对变量单纯的进行了声明, 但是没有使用它
// 会报编译错误: xxx declared but not used
//c, d := 2, 4
//fmt.Println(d)
// 如果我们从某个函数或者方法中获取了两个返回值
// 这两个返回值可能对我们都有用
peri, area := getPeriAndArea(3)
fmt.Println("半径为3的圆的周长为: ", peri, ", 面积为: ", area)
// 我们只是使用其中的一个, 我们可以选择忽略另一个
// 可以选择使用周长
_, area2 := getPeriAndArea(4)
fmt.Println("半径为4的圆的面积为: ", area2)
// 也可以选择使用面积
peri2, _ := getPeriAndArea(5)
fmt.Println("半径为5的圆的周长为: ", peri2)
}
// 计算周长和面积的函数
func getPeriAndArea(radius float64) (float64, float64) {
return 2 * math.Pi * radius, math.Pi * radius * radius
}
交换两个变量的值
// Go中可以很方便的使用平行赋值语句进行两个变量的交换
x, y := 3, 5
x, y = y, x
fmt.Println(x, y)
很好奇怎么操作的, 我就看了一下对应的汇编代码
汇编代码详解
MOVQ $3, "".a+8(SP) // 申请a的内存空间, 并写入3
MOVQ $5, "".b(SP) // 申请b的内存空间, 并写入5
MOVQ "".a+8(SP), AX // 将a这个内存空间的值3, 移到AX寄存器
MOVQ AX, ""..autotmp_2+16(SP) // 将AX寄存器中的值3, 再移到自动申请的一个临时内存空间中
MOVQ "".b(SP), AX // 将B这个内存空间中的值5, 移到AX寄存器
MOVQ AX, "".a+8(SP) // 将AX寄存器中的值5, 移到a的内容空间
MOVQ ""..autotmp_2+16(SP), AX // 将临时内存空间中的3, 移到AX寄存器中
MOVQ AX, "".b(SP) // 将AX寄存器中的3, 移到b的内存空间中, 至此就完成了两个变量的交换
总结
Go语言中的变量命名更加灵活, 关键字很少, 但是这并不代表Go语言很弱, 相反, Go语言很强大. 有各种各样的语法糖供我们使用, 也提高了我们的代码编写速度. 变量的定义与赋值也很灵活, 多个变量可以在一个括号里集中定义, 也可以分开定义. 当然对于多个返回值的函数, 我们可以有选择的进行接收, 对使用不到的值, 可用' _ '进行忽略. 处处显示着Go语言的强大与优雅. 在编写Go这种现代化语言的时候, 心情都好了很多呢!!!