Golang学习笔记(一)——那些“奇怪”的规定和特性

作者: 杰克小麻雀
原文链接: https://blog.csdn.net/yushuaigee/article/details/103444529

这几天看了一下Go语言的基础知识,还没有在项目中使用,所以还没体会到它的性能优势。而在学习基础用法部分时我最大的感受就是它的一些特性和规定很“奇怪”。以前听说Go语言声明变量时,类型关键字在变量名称后面就感觉怪怪的,没想到还有许多这样奇怪的地方(主要是和C、Python相比),在这里将这几周的学习内容和感受记录一下以备查阅。

1. 去掉循环冗余括号

C语言的数值循环:

1
2
3
for(int a = 0;a<10;a++){
// 循环代码
}

Go语言的数值循环:

1
2
3
for a := 0;a<10;a++{
// 循环代码
}

虽然这个括号确实没什么实际作用,但是Go语言中的循环的风格和C语言太像,没有那两个括号感觉怪怪的。

2. 去掉表达式冗余括号

C语言的判断语句:

1
2
3
if (表达式){
// 表达式成立
}

Go语言的判断语句:

1
2
3
if 表达式{
// 表达式成立
}

虽然这个括号确实也没什么实际作用,Python中也是这样写的,但是Python中又没有后面这个大括号。初学Go语言,写这行代码时有一点不适应。

3.强制的代码风格

Go语言中,左括号必须紧接着语句不换行。其他样式的括号将被视为代码编译错误。
也就是说代码中,用到大括号的地方,必须写成这样:

1
2
3
4
5
6
7
func main(){
//代码片段
}

for i:=0;i<10;i++{
//循环代码
}

不能写成这样:(不然连编译都通不过)

1
2
3
4
5
6
7
8
9
func main()
{
//代码片段
}

for i:=0;i<10;i++
{
//循环代码
}

这个规定让许多人觉得蛋疼,毕竟程序员大多都有强迫症,我就在网上看到一篇diss Go语言的博文,里面狠狠得吐槽了这一点。不过对于我来说还好,像我这种选择困难症和强迫症并存的人,这个规定可以让我不再纠结到底用哪种格式,大大节省了自己做思想斗争的时间。从而有更多的时间,来纠结这篇博客每一行的排版方式。||—__—

4. 不再纠结于 i++ 和 ++i

C语言非常经典的考试题:

1
2
3
int a, b;
a = i++;
b = ++i;

在Go语言中,自增操作符不再是一个操作符,而是一个语句。因此,在Go语言中自增只有一种写法:

1
i++

5. Go语言变量的声明——标准格式

Go原因是静态类型语言,因此变量是有明确类型的,编译器也会检查变量类型的正确性。Go语言和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后。当一个变量被声明之后,系统自动赋予它该类型的零值:int 为 0,float 为 0.0,bool 为 false,string 为空字符串,指针为 nil 等。所有的内存在 Go 中都是经过初始化的。

声明变量的一般形式是使用 var 关键字: var name type

1
var i int

var关键字没什么奇怪的,C#、js里也有,但是其他大部分语言声明变量时,类型都在变量名之前,以至于我们都认为这是理所当然的,而Go语言偏偏反了过来。教程上说,这样做的好处是:

可以避免像C语言中那样含糊不清的声明形式,例如:int* a, b; 。其中只有 a 是指针而 b 不是。如果你想要这两个变量都是指针,则需要将它们分开书写。而在 Go 中,则可以和轻松地将它们都声明为指针类型:var a, b *int

额(⊙o⊙),感觉这种声明方式带给我的奇怪感受,远大于将这行代码写成两行带来的“不便”。

6. Go语言变量的声明——批量格式

Go语言中的多个变量可以一起声明:

1
2
3
4
5
6
7
8
9
var (
a int
b string
c []float32
d func() bool
e struct {
x int
}
)

虽然感觉不是那么的好看,不过也算是很有自己的风格吧。就像引入多个包的时候,Go语言是这样的:

1
2
3
4
5
6
7
8
import (
"image"
"image/color"
"image/png"
"log"
"math"
"os"
)

相比于C语言中的一行一个include”Python一行一个import,这样确实少写了很多个单词,但是总是觉得不太习惯。

7. Go语言变量的声明——简短格式

Go语言中还可以使用海象操作符:=,这样声明变量:名字 := 表达式

1
2
3
a := 1
i, j := 1, 2
str := "abcd"

乍一看,好像和Python中的等号效果一样,但是这个:=在循环的时候使用是真的香,主要是可以省掉前面声明的那一句。现在新发布的Python3.8版本也加入了海象操作符。

8. Go语言匿名变量

编码过程中,可能会遇到没有名称的变量、类型或方法。虽然这不是必须的,但有时候这样做可以极大地增强代码的灵活性,这些变量被统称为匿名变量。匿名变量的特点是一个下画线__本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。

匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。在 Lua 等编程语言里,匿名变量也被叫做哑元变量。

1
2
3
4
5
6
7
8
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==1false==0,这在Go语言中是不成立的,如果必须要这么用,需要手动转化一下:

1
2
3
4
5
//b为bool型变量
i := 0
if b {
i = 1
}

 

参考链接:

Go语言入门教程——C语言中文网

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2021 杰克小麻雀
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信