这几天看了一下Go语言的基础知识,还没有在项目中使用,所以还没体会到它的性能优势。而在学习基础用法部分时我最大的感受就是它的一些特性和规定很“奇怪”。以前听说Go语言声明变量时,类型关键字在变量名称后面就感觉怪怪的,没想到还有许多这样奇怪的地方(主要是和C、Python相比),在这里将这几周的学习内容和感受记录一下以备查阅。
1. 去掉循环冗余括号
C语言的数值循环:
for(int a = 0;a<10;a++){
// 循环代码
}
Go语言的数值循环:
for a := 0;a<10;a++{
// 循环代码
}
虽然这个括号确实没什么实际作用,但是Go语言中的循环的风格和C语言太像,没有那两个括号感觉怪怪的。
2.去掉表达式冗余括号
C语言的判断语句:
if (表达式){
// 表达式成立
}
Go语言的判断语句:
if 表达式{
// 表达式成立
}
虽然这个括号确实也没什么实际作用,Python中也是这样写的,但是Python中又没有后面这个大括号。初学Go语言,写这行代码时有一点不适应。
3.强制的代码风格
Go语言中,左括号必须紧接着语句不换行。其他样式的括号将被视为代码编译错误。
也就是说代码中,用到大括号的地方,必须写成这样:
func main(){
//代码片段
}
for i:=0;i<10;i++{
//循环代码
}
不能写成这样:(不然连编译都通不过)
func main()
{
//代码片段
}
for i:=0;i<10;i++
{
//循环代码
}
这个规定让许多人觉得蛋疼,毕竟程序员大多都有强迫症,我就在网上看到一篇diss Go语言的博文,里面狠狠得吐槽了这一点。不过对于我来说还好,像我这种选择困难症和强迫症并存的人,这个规定可以让我不再纠结到底用哪种格式,大大节省了自己做思想斗争的时间。从而有更多的时间,来纠结这篇博客每一行的排版方式。||—__—
4.不再纠结于 i++ 和 ++i
C语言非常经典的考试题:
int a, b;
a = i++;
b = ++i;
在Go语言中,自增操作符不再是一个操作符,而是一个语句。因此,在Go语言中自增只有一种写法:
i++
5.Go语言变量的声明——标准格式
Go原因是静态类型语言,因此变量是有明确类型的,编译器也会检查变量类型的正确性。Go语言和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后。当一个变量被声明之后,系统自动赋予它该类型的零值:int 为 0,float 为 0.0,bool 为 false,string 为空字符串,指针为 nil 等。所有的内存在 Go 中都是经过初始化的。
声明变量的一般形式是使用 var 关键字: var name type
var i int
var关键字没什么奇怪的,C#、js里也有,但是其他大部分语言声明变量时,类型都在变量名之前,以至于我们都认为这是理所当然的,而Go语言偏偏反了过来。教程上说,这样做的好处是:
可以避免像C语言中那样含糊不清的声明形式,例如:
int* a, b;
。其中只有 a 是指针而 b 不是。如果你想要这两个变量都是指针,则需要将它们分开书写。而在 Go 中,则可以和轻松地将它们都声明为指针类型:var a, b *int
额(⊙o⊙),感觉这种声明方式带给我的奇怪感受,远大于将这行代码写成两行带来的“不便”。
6.Go语言变量的声明——批量格式
Go语言中的多个变量可以一起声明:
var (
a int
b string
c []float32
d func() bool
e struct {
x int
}
)
虽然感觉不是那么的好看,不过也算是很有自己的风格吧。就像引入多个包的时候,Go语言是这样的:
import (
"image"
"image/color"
"image/png"
"log"
"math"
"os"
)
include”,Python一行一个“import”,这样确实少写了很多个单词,但是总是觉得不太习惯。
7.Go语言变量的声明——简短格式
Go语言中还可以使用海象操作符:=,这样声明变量:名字 := 表达式
a := 1
i, j := 1, 2
str := "abcd"
等号效果一样,但是这个:=
8.Go语言匿名变量
编码过程中,可能会遇到没有名称的变量、类型或方法。虽然这不是必须的,但有时候这样做可以极大地增强代码的灵活性,这些变量被统称为匿名变量。匿名变量的特点是一个下画线“_”,“_”本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。
匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。在 Lua 等编程语言里,匿名变量也被叫做哑元变量。
func GetData() (int, int) {
return 100, 200
}
func main(){
a, _ := GetData()
_, b := GetData()
fmt.Println(a, b)
}
运行结果:
100 200
这个特性给我的直观感受比较有用。
9.Go语言bool类型
这里需要注意的地方就是,Go语言中的布尔值并不会隐式转换为数字值 0 或 1,反之亦然。
也就是说有些语言默认 true==1,false==0,这在Go语言中是不成立的,如果必须要这么用,需要手动转化一下:
//b为bool型变量
i := 0
if b {
i = 1
}
参考链接:
Go语言入门教程——C语言中文网