0.引子
这个系列主要用来记录在字节青训营的GO学习所得
1.你好,世界:
来一个经典起手式,hello world,同时借这个程序简单分析一下go语言中一个基本程序的构成
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Go语言的整体风格趋近于c/c++,同时兼具python的简洁,在这个代码中,我们首先在行1见到了package的概念, 在Go中,任何一个程序都需要属于某一个包,这种设计的源头来自于Go使用包来组织源代码的,并实现命名空间的管理。
第二行的import "fmt"则代表引fmt包,与其他语言类似,go语言内置了标准库,用于方便开发者控制输入输出,其中fmt库主要用于精细化控制代码的输出格式。
第三行来到了我们的主函数,与c语言相同,go语言大部分程序的执行都是从main函数开始的,有关函数的概念会在后面的章节进行进一步的介绍,此处main函数中只有一条语句,用于调用fmt包中的Println这个方法打印Hello World!这串字符
2.变量与常量的定义:
Go语言定义变量和常量的方式有很多,本文中主要介绍以下3类
2.1全局变量声明与赋值:
在go中,可以通过var关键字对全局变量进行声明,同时也可以在声明的同时对其进行赋值,具体的方式如下所示:
var a int
var b float
var a int = 1
var b, c int = 1, 2
2.2局部变量声明与赋值:
在go中,也可以通过:=来对局部变量进行声明和赋值。
a := 1
b := "hello"
2.3通过类型推导对变量进行声明和赋值:
这种可以被视为全局变量声明与赋值的一种变体,此时我们不需要给出具体的变量的数据类型,其主要形式如下所示:
var user = "Hank"
var num = 1
2.4 常量的定义:
//单个常量定义
const a int = 1
//一次定义多个
const (
Unknown = 0
Female = 1
Male = 2
)
2.5 几个小坑:
- Go中的变量在声明后必须被使用(这一点编译器回帮助检查)
- Go中根据首字母的大小常常被用来确定访问权限。无论是方法名、常量、变量名还是结构体的名称 如果首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中(即本程序中)使用
3 函数
在上个章节中提到了main函数,Go中的函数的定义与大部分程序语言相同,在这里我们先对Go语言中函数的一些特性基本性质做一个简单的介绍:
- 函数可以作为值进行传递:在Go语言中,函数可以像其他类型的值一样被传递给其他函数或赋值给变量。这意味着可以将函数作为参数传递给其他函数,也可以将函数作为返回值返回。
- 函数可以赋值给变量:在Go语言中,可以将函数赋值给变量,然后通过变量来调用函数。这种能力使得函数可以像其他数据类型一样被操作和处理。
- 函数可以匿名定义:Go语言支持匿名函数的定义,也称为闭包。这意味着可以在不给函数命名的情况下直接定义和使用函数,更加灵活和便捷。
- 函数可以作为数据结构的成员:在Go语言中,函数可以作为结构体的成员,从而使得函数与其他数据一起存储在结构体中。这种特性使得函数能够更好地与数据相关联,实现更复杂的功能。
一个经典的Go函数的定义如下:
func add(a, b int) int {
return a + b
}
值得留意的是go语言中的函数同时支持返回多个返回值,具体的形式如下所示:
func add(a, b int) int {
return a + b,a,b
}
4 流程控制
4.1 if-else
这个其实相对没有太多难点,简单用一个判断奇数偶数的程序来做一个示例
package main
import (
"fmt"
)
func main() {
num := 27
if num % 2 == 0 { //判断条件:是否可以被2整除
fmt.Println("这是个偶数")
} else {
fmt.Println("这是个奇数")
}
}
Go同时也支持else-if结构,具体实现是这样
import (
"fmt"
)
package main
import (
"fmt"
)
func main() {
num := 100
if num <= 20 {
fmt.Println("数字小于20捏")
} else if num >= 21 && num <= 30 {
fmt.Println("数字在21和30之间捏")
} else {
fmt.Println("数字大于30捏")
}
}
4.2 循环
go中没有while循环,循环主要通过for循环来执行,以下通过一个简单的例子来说明基本循环结构,下面是一简单的求累加和的程序,整体风格和c/c++的一致
package main
import "fmt"
func main() {
sum := 1
for ; sum <= 10; {
sum += sum
}
fmt.Println(sum)
}
这段代码可以将循环部分更改为更加接近于while循环的风格
for sum <= 10{ //类似于while(condition)
sum += sum
}
break和continue的用法和其他程序语言中类似,break用来跳出这个循环,continue则用于跳过当前循环的剩余循环,以下是一个break的例子
package main
import (
"fmt"
)
func main() {
i := 0
for {
i++
if i > 5 {
break //只打印0到5,到5的时候直接跳出这个循环
}
fmt.Println(i)
}
}
而以下是一个continue的例子,跳过打印数字6
package main
import (
"fmt"
)
func main() {
i := 0
for i <= 10 {
i++
if i == 6 {
continue //跳过打印6
}
fmt.Println(i)
}
}