Go 语言笔记 -5:函数

  1. 函数声明语法:
1
2
3
func functionname(parametername1 type, parametername2 type) returntype {  
// 函数体(具体实现的功能)
}
  1. 如果有连续若干个参数,它们的类型一致,那么我们无须一一罗列,只需在最后一个参数后添加该类型。
1
2
3
func functionname(parametername1, parametername2 type) returntype {  
// 函数体(具体实现的功能)
}
  1. Go 语言支持一个函数可以有 多个返回值
1
2
3
func functionname(para1 type1, para2 type2) (returntype1, returntype2, ...) {
// 函数体(具体实现的功能)
}
  1. 命名返回值 :从函数中可以返回一个命名值。一旦命名了返回值,可以认为 这些值在函数第一行就被声明为变量了,在函数 return 时不必再跟随命名值。如area, perimeter
1
2
3
4
5
func rectProps(length, width float64) (area, perimeter float64) {  
area = length * width
perimeter = (length + width) * 2
return // 不需要明确指定返回值,默认返回 area, perimeter 的值
}
  1. 空白符_ 在 Go 中被用作空白符,可以用作表示任何类型的任何值。
1
area, _ := rectProps(10.8, 5.6) // 返回值周长被丢弃

Go 语言笔记 -6:包

  1. package packagename 指定了某一源文件属于一个包,它应该放在每一个源文件的第一行。

  2. main 包和自定义包目录结构(属于某一个包的源文件,都应该放置于一个单独命名的文件夹里,且应该用包名命名文件夹名):

1
2
3
4
5
6
7
8
9
src
geometry // 自定义 main 包
geometry.go // main 函数
rectangle // 自定义包,文件名为包名
rectprops.go // 属于 rectangle 包的源文件
bin
// 通过执行 go build geometry/geometry.go 编译得到
geometry (Linux)
geometry.exe (Windows)
  1. 导入自定义包:import packagepath,必须指定自定义包 packagename 相对于工作区 src 文件夹的相对路径,如:import "geometry/rectangle"

  2. 导出名字:在 Go 中,任何 以大写字母开头的变量或者函数都是被导出的名字,其它包只能访问被导出的函数和变量(即,如果想在包外访问一个函数,它应该首首字母大写。也就是说,小写字母开头的变量或函数类似于 C 语言中被 static 修饰的变量或函数)。

  3. init 函数:所有包都可以包含一个 init 函数,init 函数不应该有任何返回值类型和参数。

    • 包的初始化顺序:1)首先初始化 被导入的 包;2)然后初始化 包级别(package level)的变量 ;3)紧接着 调用 init 函数,按照编译器解析它们的顺序进行调用。

    • 如果一个包导入了另一个包,会先初始化 被导入的 包。

    • 尽管一个包可能会被导入多次,但是它们 只会被初始化一次

  4. 空白标识符导入包中的使用:导入了包,却不在代码中使用它,这在 Go 中是非法的,会抛出 xxx.go:6: imported and not used: packagename_yyy

    • 为了避免这种程序错误,通常会在函数外调用其中的一个函数,并将返回值赋给 _ 变量,把这一操作称为「错误屏蔽器」。

    • 同时,有时我们并不想使用导入的包中的任一函数或变量,只是 为了确保它进行初始化,这种情况可以使用空白标识符 _,如 import _ "geometry/rectangle"。这样在不调用包中的函数或变量时,也不会报错。


Go 语言笔记 -7:if-else

  1. 即使 if 状态下仅有一条语句,也必须加 { }
1
2
3
4
5
6
7
if condition {

} else if condition {

} else {

}
  1. if 还有另外一种形式,它包含一个 statement 可选语句部分,该组件在条件判断之前运行,语法为:if statement; condition { },其中 statement 的作用域仅在 if-else 范围内。
1
2
3
4
5
6
7
func main() { // num 的范围仅限于 if else 代码块
if num:= 10; num % 2 == 0 {
fmt.Println(num, "is even.")
} else {
fmt.Println(num, "is odd.")
}
}
  1. 一个注意点else 必须键入在 } 后面,不能另取一行键入,因为 Go 语言默认在每条语句结束时插入一个分号,但 if else 是一个整体。

Go 语言笔记 -8:循环

  1. Go 语言中唯一的循环语句是 for,没有 whiledo while 循环。
1
2
3
for initialisation; condition; post {  
// 循环体
}
  • for 循环的三个组成部分,即初始化、条件和 post 都是可选的(可有可无),如下示例都可以(分号也是可以省略的)。
1
2
3
4
5
6
7
8
9
10
for ; i <= 10; {
// ...
}
for {
// ...
}
for i <= 10 {
// ...
i += 2
}
  1. break 为跳出循环,continue 为不执行后续语句,进入下一次循环。

Go 语言笔记 -9:switch 语句

  1. switch是一个条件语句,它可以被认为是替代多个 if else 子句的常用方式,case 不允许出现重复项。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func main() {
finger := 4
switch finger {
case 1:
fmt.Println("Thumb")
case 2:
fmt.Println("Index")
case 3:
fmt.Println("Middle")
case 4, 5: // 一个选项多个表达式
fmt.Println("Ring or Pinky")
default: // 默认情况
fmt.Println("incorrect finger number")
}
}
  1. 先声明变量再使用switch varname := xxx; varname {...},此时的 varname 变量的作用域仅限于当前 switch 内。

  2. 无表达式的 switch:在 switch 语句中,表达式是可选的,可以被省略。如果省略表达式,则表示这个 switch 语句 等同于 switch true,并且 每个 case 表达式都被认定为有效,相应的代码块也会被执行

  3. fallthrough 关键字:fallthrough 语句可以在已经执行完成的 case 之后,把控制权转移到下一个 case 的执行代码中,而不会跳出 switch。

1
2
3
4
5
6
7
8
9
func  main() {
switch num := 3; {
case num == 3:
fmt.Println("==")
fallthrough
case num < 10:
fmt.Println("yes")
}
}
  1. switch 和 case 的表达式不一定是常量。

学习链接:https://studygolang.com/subject/2,感谢如此优秀的教程!