Go语言光速入门(一) | 青训营笔记

323 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。

看完本篇可以帮助大家快速上手go语言!

基础语法与代码风格

  1. 源文件后缀名.go,入口是main()函数,main()函数必须在main包。

  2. go语言严格区分大小写,大写公开,小写私有。

  3. 每条语句后面不需要分号,编译器会自动加上分号。(你写分号不会报错。)

  4. 每一行必须只写一句,i++必须独占一行。

  5. { 不能单独放在一行,否则会报错。

  6. 引入的包和定义的变量必须使用,如果不用则编译报错。

  7. 先写变量名,再写类型名,如:var x int。

  8. 函数允许有多个返回值。

  9. 函数本身也是一种数据类型,可以作为参数传递。

  10. 变量不赋值,默认给零值。

  11. 与Java不同,Java的所有变量和方法都写在类的内部,以类为单位组织代码。Golang 则是包内写变量、方法,以包为单位组织代码。

  12. 如果代码过长,可以换行保持优雅,注意不要在括号处换行。

  13. 注释风格和Java一样,//行注释,/**/块注释。

  14. 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条件判断

  1. Go语言中条件语句不需要圆括号,但是分支中必须有大括号。

  2. Go语言条件语句中可以用 := 初始化一个变量,不过需要记住,这个变量是局部变量,该变量的作用域仅在if范围之内

  3. Go语言里面对 if/else 格式对齐要求很严格,如果需要 if/else 组合,则需要在if语句结束的大括号后面就跟上else,这里写上代码

  4. 关键字 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有如下特点:

  1. 其他语言不能做区间判断,但是go可以。

  2. 与其他语言不同,case中默认带break,也就是说不会自动穿透。

  3. 匹配不到则执行default语句块,default不是必须的。

  4. case表达式可以有多个,用逗号隔开。意思是都匹配。

  5. case表达式如果是常量则要求不能重复,常量会骗过编译器。

  6. 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")