Go语言入门指南(上)
实践记录 · 2023/7/27 · 玉米哥
目录
变量
循环
分支
函数
面向对象设计
本篇文章,我将从五个方面来讲讲Go语言的语法特性:变量、分支、循环、函数和面向对象设计。入手任何一门编程语言,我们都可以从这几个方面出发,从而快速掌握语言的语法特性。
以下内容主要总结于
- 字节跳动青训营后端入门 - Go语言原理与实践
- Go语言官方文档教程
- Go语言圣经
变量
任何编程语言都离不开变量,一提到变量,我们可以想到变量的类型,变量的声明,变量的初始化等。
在Go语言中,变量是强类型的,而不是弱类型的,这就意味着我们必须在声明变量的时候指明变量的类型。
使用var
关键字声明变量。
var greeting = "Hello, ByteTech" // 字符串
var great = 666 // 数值
var isHappy = true // 布尔值
看到上面的语句,有些同学们可能会产生疑惑,不是说Go语言是强类型吗?为什么没有指定变量的类型呢,这是因为编译器可以根据右侧的值自动推断出变量的类型,因此,我们在变量声明时可以省略掉变量的类型。
此外,Go语言引入了一种新的方式,一气呵成地完成变量的声明与初始化,那就是使用:=
运算符。
greeting := "Hello, ByteTech"
great := 666
isHappy := true
如果我们需要强调变量的类型,也可以手动指明变量的类型。
var greeting string = "Hello, ByteTech"
var great int32 = 666
var isHappy bool = true
需要特别强调的是,Go语言中常量的声明与其他语言不太相同,需要使用const
关键字替换var
关键字。
const greeting = "Hello, ByteTech"
const great int32 = 666
const isHappy = true
下面我们介绍Go中常用的一些数据类型。
数组
var greetings [2]string
greetings[0] = "Hello, "
greetings[1] = "ByteTech!"
或者,你可以尽情地使用:=
运算符。
greetings := [2]string{"Hello, ", "ByteTech!"}
在实践中,数组的使用场景比较局限,更受欢迎的一种数据类型则是切片。
切片
切片是Go语言特有的类型,可以将其类比为动态数组,可以在声明时不指定大小。
声明并初始化切片
greetings := make([]string, 2)
greetings[0] = "Hello, "
greetings[1] = "ByteTech!"
向切片中添加元素
greetings = append(greetings, "Hello, ")
greetings = append(greetings, "Byte ", "Dance")
获取切片大小
len(greetings)
产生切片的拷贝
another := make([]string, len(greetings))
copy(another, greetings)
有同学可能会疑惑,为什么要大费周折使用copy函数,而不直接使用another = greetings
呢,其实,Go语言中的切片类似于指针或者引用,变量中存放的不是切片的内容,而是对变量内容的引用。
打个不恰当的比方,你面前有一排排房屋,第一间房屋里有“Hello”字样的招牌,第二节房屋里有“ByteTech”字样的招牌。你使用标有“greetings”字样的望远镜观察着这两间房屋,这就是切片的本质。
当我们使用another = greetings
时,相当于有另一台望远镜,标有“another”,而another望远镜也正在观察着你观察的这两间房屋,在这个过程中,“Hello, ”“Byte Tech”招牌本身并没有被拷贝。只是现在可以被greetings和another同时观察到。
当使用copy函数时,情况就不尽相同了。greetings望远镜依旧观察着初始两间房屋里的招牌。但是,another望远镜会观察另外两件房屋,里面有相同的招牌,这个时候,招牌本身(也就是切片的内容)被拷贝了。
希望这个例子能加深你对切片的理解。
选取切片中的部分
和python语言的语法类似,Go语言使用左开右闭区间选取对应下标范围内的的部分元素。
// slice[n:m]
// 开始下标:n
// 结束下标:m - 1
// 元素个数:m - n
greetings[1:]
greetings[:2]
greetings[1:3]
字典
Go语言中的map类型,类似其他语言中的字典或哈希表。
声明并初始化字典
使用make函数声明并初始化字典
slogans := make(map[string]string)
添加键值对
slogans["飞书"] = "先进团队,先用飞书"
slogans["抖音"] = "记录美好生活"
slogans["B站"] = "哔哩哔哩,干杯"
删除键值对
delete(slogans, "B站")
循环
在Go语言中,只保留了一种循环,即for循环,但是可以实现其他循环的功能。我们先写一个标准的for循环,回忆一下,一个标准的for循环,由三部分组成:初始化循环变量,判断条件,更新循环变量。
标准for循环
标准的for循环执行流程:
- 初始化循环变量
- 检查判断条件是否为真,若为真,执行步骤3,否则执行步骤6
- 执行循环体
- 执行表达式,更新循环变量
- 回到步骤2
- 退出循环
for counter := 3; counter > 0; counter-- {
fmt.Println(counter)
}
注意:Go语言中,for循环语句不需要添加()
括号,但是需要添加{}
括号。
while循环
Go语言中没有while循环,那如何使用for循环来实现while循环呢?
答案其实很简单,只需要将关键字for
想象成while
就可以。
counter := 3
for counter > 0 {
fmt.PrintLn(counter)
counter--
}
死循环
如果for循环语句中不包含以上提到的三部分,则会成为死循环,可以使用break
或return
跳出循环。
for {
fmt.PrintLn("这是一个死循环")
}
如上的示例代码,正好向我们展示了Go语言的简洁性,一目了然,方便记忆,能够大大减少编码的工作量。
分支
Go循环的分支语句和其他语言类似,话不多说,直接上代码。
if-else分支
day := "周末"
if day == "周末" {
fmt.PrintLn("享受生活")
} else {
fmt.PrintLn("摸鱼等待周末到来中")
}
if-else if分支
day := "周一"
if day == "周一" {
fmt.PrintLn("痛苦的一周开始了")
} else if day == "周五" {
fmt.PrintLn("痛苦的一周结束了")
} else if day == "周末" {
fmt.PrintLn("享受生活")
} else {
fmt.PrintLn("在摸鱼中期盼周末的到来")
}
注意,分支语句也可以将需要判断的变量放入第一个if分支中。
if day := "周一"; day != "周末" {
fmt.PrintLn("痛苦上班中")
} else {
fmt.PrintLn("周末不加班,请勿扰")
}
switch分支
Go语言中的switch分支语句与其他语言略有不同,在其它语言中,若case语句结束时若没有break结尾,则会执行顺次执行接下来的case语句。而在Go语言中,不需要添加break,默认执行对应的case语句后退出。
score := 10
switch score {
case 10: fmt.PrintLn("卷王")
case 9 : fmt.PrintLn("略有遗憾")
case 8 : fmt.PrintLn("中不溜秋")
case 7 : fmt.PrintLn("进步空间很大")
case 6 : fmt.PrintLn("可喜可贺")
default: fmt.PrintLn("摆烂了")
}
下一步
由于篇幅的限制,本篇文章暂时写到这里,关于函数和面向对象设计的部分,会在另一篇文章中写出。
码字不易,如果您看到了这里,听我说谢谢你😀
如果您觉得本文还不错,请留下小小的赞😀
如果您有感而发,请留下宝贵的评论😀