这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。
看完本篇可以帮助大家快速上手go语言!
基础语法与代码风格
-
源文件后缀名.go,入口是main()函数,main()函数必须在main包。
-
go语言严格区分大小写,大写公开,小写私有。
-
每条语句后面不需要分号,编译器会自动加上分号。(你写分号不会报错。)
-
每一行必须只写一句,i++必须独占一行。
-
{ 不能单独放在一行,否则会报错。
-
引入的包和定义的变量必须使用,如果不用则编译报错。
-
先写变量名,再写类型名,如:var x int。
-
函数允许有多个返回值。
-
函数本身也是一种数据类型,可以作为参数传递。
-
变量不赋值,默认给零值。
-
与Java不同,Java的所有变量和方法都写在类的内部,以类为单位组织代码。Golang 则是包内写变量、方法,以包为单位组织代码。
-
如果代码过长,可以换行保持优雅,注意不要在括号处换行。
-
注释风格和Java一样,//行注释,/**/块注释。
-
go中输出时候字符串可以使用 , 进行连接。
Hello World
每次学一门新的语言我们肯定是要看如何用这门语言如何输出Hello World了,在go中:
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
变量
与Java相同,Go也拥有多种值类型,包括字符串、整型、浮点型、布尔型等。
但是在go语言中声明变量的一般形式是使用 var 关键字,然后先写变量名再写类型名。如下:
var a int //若不赋值,则默认值为0
var b int = 10 //声明同时赋值
var c = 15 //省略类型,go可以根据值自动推断类型
在go中也有一种特殊的简写形式:
var d = 20 //不简写形式定义
d :=20 //简写形式定义
要注意的是这种简写不可用于定义全局变量
常量
常量定义的关键字:const
常量必须在声明的同时赋值。
const a int = 8//定义整型常量,赋值为8
const b ="abc"//定义常量并赋值,省略类型,推断为字符串
因为常量const关键字不能省略,所以也不能用:=。
循环
在go中for 是唯一的循环结构。 这里没有while等。循环格式如下:
//最基础的方式,单个循环条件
i := 1
for i <= 5 {
fmt.Println(i)
i = i + 1
}
//经典的初始/条件/后续 for 循环。
for j := 2; j <= 7; j++ {
fmt.Println(j)
}
//不带条件的 for 循环将一直重复执行, 直到在循环体内使用了 break 或者 return 跳出循环。
for {
fmt.Println("hello")
break
}
值得一提的是go语言中break,除了平常的使用方法还有一种go独特的使用方法,即:break+标签 。
标签用于标示break跳出的是哪一层循环。
用法:以双重for循环为例,break跳出的是哪个循环,就把标签写到那个for上方,标签后面要有冒号。如下:
for i := 1; i < 10; i++ {
label2:
for j := 1; j <= i; j++ {
fmt.Print(j," * ",i," = ",i*j," ")
if(i==7&&j==3){
break label2;//跳出内层循环
}
}
fmt.Println()
}
条件判断
这里的条件判断有两种:if/else条件判断,switch分支判断。
if/else条件判断
-
Go语言中条件语句不需要圆括号,但是分支中必须有大括号。
-
Go语言条件语句中可以用
:=初始化一个变量,不过需要记住,这个变量是局部变量,该变量的作用域仅在if范围之内。 -
Go语言里面对 if/else 格式对齐要求很严格,如果需要 if/else 组合,则需要在if语句结束的大括号后面就跟上else,这里写上代码
-
关键字 if 和 else 之后的左大括号 { 必须和关键字在同一行,如果你使用了 else-if 结构,则前段代码块的右大括号 } 必须和 else-if 关键字在同一行。这两条规则都是被编译器强制规定的。
如下:
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
if 8%4 == 0 {
fmt.Println("8 is divisible by 4")
}
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
switch分支判断
在go中switch有如下特点:
-
其他语言不能做区间判断,但是go可以。
-
与其他语言不同,case中默认带break,也就是说不会自动穿透。
-
匹配不到则执行default语句块,default不是必须的。
-
case表达式可以有多个,用逗号隔开。意思是都匹配。
-
case表达式如果是常量则要求不能重复,常量会骗过编译器。
-
switch和case的表达式数据类型要一致。
最常见的switch语句,如下:
score := 85
grade := "优秀"
switch {
// 其他语言不能做区间判断,但是go可以
case score > 90:
grade = "卓越"
case score >= 80 && score <= 89:
grade = "优秀"
case score >= 70 && score <= 79:
grade = "良好"
case score >= 60 && score <= 69:
grade = "及格"
default:
grade = "不及格"
}
如果case语句块后面有fallthrough关键字,则会穿透,不判断下一个case,直接执行下一个case的语句块。默认只能穿透一层。如下:
case 10:
fmt.Println("ok1")
fallthrough//如果匹配到10,输出“ok1”,此处fallthrough会穿透case 20
case 20: //如果是穿透来的,不判断,直接执行下面语句块
fmt.Println("ok2")