Go 笔记之程序结构
同其它语言一样,Go也有顺序,分支,循环三大程序结构,只不过它更精炼。
顺序
- if 条件判断(许初始化变量)
- 条件判断语句里面允许声明一个变量,该变量的作用域只能在该条件逻辑块内
-
goto 无条件跳转
- 用goto 跳转到必须在当前函数内定义的标签
-
标签名是大小写敏感的。
func myFunc() { i := 0 Here: // 这行的第一个词,以冒号结束作为标签 println(i) i++ goto Here // 跳转到 Here 去 }
循环
- for
- 循环读取数据,可作while控制逻辑(注意 golang中无while语句)
sum := 1 for sum < 1000 { sum += sum }
- 迭代操作
- for 配合 range 可以用于读取 slice 和 map 的数据
- break 和 continue 还可以跟着标号,用来跳到多重循环中的外层循环
- 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
- 循环读取数据,可作while控制逻辑(注意 golang中无while语句)
分支
-
switch
- 表达式不必是常量或整数
- 执行的过程从上至下,直到找到匹配项
- 如果 switch 没有表达式,它会匹配 true。
-
switch 默认相当于每个 case 最后带有 break,匹配成功跳出整个switch,可以使用 fallthrough 强制执行后面的 case 代码。
i := 10 switch i { case 1: fmt.Println("i is equal to 1") case 2, 3, 4: fmt.Println("i is equal to 2, 3 or 4") case 10: fmt.Println("i is equal to 10") fallthrough default: fmt.Println("All I know is that i is an integer") }
函数
-
特点
- 支持多值返回,命名返回值,必须声明类型
- 函数可以有一个或者多个参数,每个参数后面带有类型,通过,分隔
-
可命名返回参数的变量,若函数是导出建议命名返回值
func SumAndProduct(A, B int) (add int, Multiplied int) { add = A+B Multiplied = A*B return } // 支持变参 func myfunc(arg ...int) {} type testInt func(int) bool // 声明了一个函数类型
-
传值 vs 传指针
- 传参实际上是传值,其值可以是变量的值,也是可以是变量的地址,即指针
- 变量在内存中是存放于一定地址上的,修改变量实际是修改变量地址处的内存
- 传指针使得多个函数能操作同一个对象。
- 传指针比较轻量级 (8bytes),只是传内存地址,指针传递体积大的结构体
- 若用参数值传递的话, 在每次 copy 上面就会花费相对较多的系统开销(内存和时间)
- Go 语言中 channel,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针
关键字
- defer规则
- 多个defer调用 defer,那么 defer 是采用后进先出模式
- defer 后指定的函数会在函数退出前调用
- 当函数执行到最后时,这些 defer 语句会按照逆序执行,最后该函数返回。
- 函数可作为值类型,常用在写通用接口
- panic Recover
- main init
- init 函数 能够应用于所有的 package,可选
- main 函数(只能应用于 package main,必选)
- 这两个函数在定义时不能有任何的参数和返回值。
- 程序的初始化和执行都起始于 main 包
- 流程
- main导入包
- 对导入包内的常量和变量进行初始化
- 执行导入包内的init函数
- 对main包中的包级常量和变量进行初始化,执行main包init,main函数
- 关键字列表
- defer 用于类似析构函数
- go 用于并发
- select 用于选择不同类型的通讯
- interface 用于定义接口
- struct 用于定义抽象数据类型
- chan 用于 channel 通讯
- type 用于声明自定义类型
- map 用于声明 map 类型数据
- range 用于读取 slice、map、channel 数据
import
- GOROOT 环境变量指定目录下去加载该模块
// 当前文件同一目录的 model 目录,但是不建议这种方式来 import import "./model" // 绝对路径 加载 gopath/src/shorturl/model 模块 import "shorturl/model"
-
import 简化行为 - 点 省略前缀的包名 - 别名 - _ 调用包里面的 init 函数
import ( // 即调用 fmt.Println("hello world") 可以省略的写成 Println("hello world") . "fmt" ) import( // 即可 f.Println("hello world") f "fmt" ) import ( "database/sql" // 调用了该包内的init函数,但不对其它内容进行导入处理 _ "github.com/ziutek/mymysql/godrv" )
本作品采用《CC 协议》,转载必须注明作者和本文链接