Go语言入门指南(上) | 青训营

435 阅读6分钟

Go语言入门指南(上)

实践记录 · 2023/7/27 · 玉米哥

目录

变量
循环
分支
函数
面向对象设计

本篇文章,我将从五个方面来讲讲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循环执行流程:

  1. 初始化循环变量
  2. 检查判断条件是否为真,若为真,执行步骤3,否则执行步骤6
  3. 执行循环体
  4. 执行表达式,更新循环变量
  5. 回到步骤2
  6. 退出循环
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循环语句中不包含以上提到的三部分,则会成为死循环,可以使用breakreturn跳出循环。

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("摆烂了")
}

下一步

由于篇幅的限制,本篇文章暂时写到这里,关于函数和面向对象设计的部分,会在另一篇文章中写出。

码字不易,如果您看到了这里,听我说谢谢你😀

如果您觉得本文还不错,请留下小小的赞😀

如果您有感而发,请留下宝贵的评论😀