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

这几天看了一下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"
)

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

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

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

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

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

 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语言中文网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值