本篇内容主要是对于Go语言的基础及其相关特殊性语法进行总结。
- 不同于Go build, Go run不会创建可执行文件。故在开发阶段,使用命令go run,开发完毕进行分享时,使用Go build。
- Go语言在打造之初目的是用于开发高流量生产系统的语言。
- 使用Go语言编写的函数中,对参数和返回值的类型都做了声明。
func addition(x int, y int) int { return x + y }
- 布尔值只能为true和false,0和1是不允许的。
- 声明数组时必须指定长度和类型。
var bele [4]string bele[0] = "jogn"
- strconv包提供了一整套类型转换的方法。
- Go负责分配内存和执行垃圾手机,正常的内存使用规则依然适用,但是无须直接管理内存。
- 声明变量时如果没有给它指定值,则变量将被赋默认值即零值。所以为确定变量是否已经赋值,不能检查它是否为nil,而必须检查它是否为默认值。
- 不能在函数外面使用简短变量声明。
- 在变量名签名加上&,获取变量在内存中的地址。
s := "Hello" fmt.Println(&s) //内存地址的十六进制
- 声明常量用const。
const gree string = "Hello"
- 函数return语句返回了多个用逗号分隔的值。在接收的时候同时用逗号隔开,先后对应。
- 函数中能够传递可变数量的参数,但是它们的类型必须与函数签名指定的类型相同,并且必须在参数表的最后一个。
func sumNumber(numbers... int) int { total := 0 for _, number := range numbers { total += number } return total }
- 具名返回值让函数能够在返回前将值赋给具名变量。
//func 函数名(参数表)(具名变量 返回类型){ // 函数体 // 具名变量 = 返回值 // return //} func bar(x, y int) (a, b, c int){ //具名返回值 sum, sub, mul = x+y, x-y, x*y return //裸返 } func main(){ d, e := 13, 2 fmt.Println(bar(d,e)) // 15 11 26 }
- 递归函数最少有两个return,在结尾ruturn中调用自己,在函数体中设定条件后return结果。
- Go将函数视为一种类型,因此可将函数赋给变量,以后通过变量来调用他们。
func an(f func() string) string{ return f() } func main() { fn := func() string{ return "function called" } fmt.Println(an(fn)) }
- switch语句支持在其他case条件都不满足时将执行的default case。
s := "c" switch s { case "a": fmt.Println("xx") case "b": fmt.Println("xx") default: fmt.Println("xx") }
- for语句遍历数据结构展示。
numbers := []int(1, 2, 3, 4) for i, n := range numbers { fmt.Println("the index of the loop is", i) fmt.Println("the value from the array is", n) }
- defer能够让在函数返回前执行另一个函数。
func main(){ defer fmt.Println("1") fmt.Println("2") } // 输出 2 1
- 打印数组的所有元素,可使用变量名本身。
- 切片类似于数组,但是可以在切片中添加和删除元素。
func main(){ var che = make([]string, 2) che[0] = "1" che[1] = "2" che = append(che, "3") //1 2 3 che = append(che[:2], che[2+1:]...) //1 2 删除索引2 var s = make([]string, 2) copy(s, che) //复制切片 }
- 映射是键-值对集合,相当于python中的字典。
var p = make(map[string]int) p["c"] = 2 delete(p, "c")
- 通过使用结构体,可在单个变量中存储众多类型不同的数据字段。
type mo struct{ name string rating float64 } //定义一个mo结构体 var xx mo xxx := mo{"x", 10}
- 当字段很多时,让每个字段独占一行能够提高代码的可维护性和可读性,但是值得注意的是,在这种情况下最后一个数据字段所在的行也必须以逗号结尾。
xxx := mo { name: "x", rating: "12", }
- 要访问内嵌结构体的数据字段,可使用点表示法。
-
go语言中的零值 类型 零值 布尔型 false 整形 0 浮点型 0.0 字符串 " " 指针 nil 函数 nil 接口 nil 切片 nil 通道 nil 映射 nil - Go语言设有提供自定义默认值的内置方法,可以使用构造函数实现。
type Al struct { Time string Sound string } func NewAl(time string) Al { a := al{ Time: time, Sound: "xdx", } return al } //不直接创建结构体Al,而是使用函数NewAl来创建,从而让字段Sound包含自定义的默认值。
- 对结构体进行比较,要先看它们的类型和值是否相同。对于类型相同的结构体,使用==来比较,对于类型不同的结构体,则会导致编译错误。
- 要导出结构体及其字段,结构体及其字段的名称都必须是以大写字母打头。
- 通过声明方法,让结构体的任何实例都可以使用。
type Mo struct { Name string Rating float64 } func sum(m *Mo) string { //code } xx := {"sd","2.3"} xx.sum() //方法的调用
- 任何数据类型都可有相关联的方法集。方法集可包含的方法数量不受限制,这是一种封装功能和创建库代码的有效方式。
- 指针和值之间的差别很微妙,但选择使用指针还是值这一点很简单:如果需要修改原始结构体,就使用指针;如果需要操作结构体,但不想修改原始结构体,就使用值。
- 接口描述了方法集中的所有方法,并指定了每个方法的函数签名。
- 接口是方法集的蓝本,要使用接口,必须先实现它。
- 函数签名相同的条件(函数名、参数、返回值的类型、个数和顺序都相同)。
- 接口也是一种类型,可作为参数传递给函数。
- Go语言没有提供类和类继承等面向对象功能,但结构体和方法集弥补了这部分不足,提供了一些面向对象元素。
- 接口以声明的方式提供了多态,因为接口描述了必须提供的方法集以及这些方法的函数签名,如果一个方法集实现了一个接口,就可以说它与另一个实现了该接口的方法集互为多态。
- 严格的说,方法和函数的唯一差别在于,方法多了一个指定接受者的参数。