生活中描述事物无非就是描述事物的 属性 和 行为。 如:人有身高,体重等属性,有说话,打架等行为。 事物名称(类名):人(Person) 属性:身高(height)、年龄(age) 行为(功能):跑(run)、打架(fight) Go 语言中用类来描述事物也是如此 属性:对应类中的成员变量。 行为:对应类中的成员方法。 定义类其实在定义类中的成员(成员变量和成员方法) 拥有相同或者类似 属性(
面向对象思想 面向对象(Object Oriented,OO)是软件开发方法 面向对象是一种对现实世界抽象的理解,是计算机编程技术发展到一定阶段后的产物 Object Oriented Programming-OOP ——面向对象编程 面向对象和面向过程区别 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 关注的是解决问题需要哪些步骤 回想下前面我们完成一个
Go 语言中的接口和现实生活中的 USB 插槽很像,它定义某种标准,但不关心具体实现 无论你到哪个商店里面去购买USB线,只要你告诉商家你需要一根USB线,买回家之后就一定能插到电脑上使用,之所以能用,原因就是电脑厂商在指定了USB插槽的标准(尺寸、排线等等),生产厂家只需要按照标准生产即可 同样在 Go 语言中我们可以通过接口来定义某种标准(函数声明),但不用不关心具体实现(函数实现),只要将来
Go 语言中的方法其实就是一个特殊函数,只不过这个函数是和某种属性类型绑定在一起的而已 Go 语言中的方法 一般用于 将 函数和结构体绑定在一起,让结构体除了能够保存数据外还能具备某些行为 将函数和数据类型绑定的格式 只需要在函数名称前面加上(接收者 数据类型),即可将函数和某种数据类型绑定在一起 func (接收者 数据类型)方法名称(形参列表)(返回值列表){ 方法体 } 示例:给结构
Go 语言中指向结构体的指针和 C 语言一样 结构体和指针 创建结构体指针变量有两种方式 package main import "fmt" type Student struct { name string age int } func main() { // 创建时利用取地址符号获取结构体变量地址 var p1 = &Student{"lnj", 33}
与普通指针并无差异 package main import "fmt" func main() { var dict map[string]string = map[string]string{"name":"lnj", "age":"33"} var p *map[string]string = &dict (*p)["name"] = "zs" fmt.Println(di
值得注意点的是切片的本质就是一个指针指向数组,所以指向切片的指针是一个二级指针 package main import "fmt" func main() { // 1.定义一个切片 var sce[]int = []int{1, 3, 5} // 2.打印切片的地址 // 切片变量中保存的地址, 也就是指向的那个数组的地址 sce = 0xc0420620a0 f
在 C 语言中,数组名,&数组名,&数组首元素保存的都是同一个地址 #include <stdio.h> int main(){ int arr[3] = {1, 3, 5}; printf("%p\n", arr); // 0060FEA4 printf("%p\n", &arr); // 0060FEA4 printf("%p\n", &a
和 C 语言一样,允许用一个变量来存放其它变量的地址,这种专门用于存储其它变量地址的变量,我们称之为指针变量 和 C 语言一样,Go 语言中的指针无论是什么类型占用内存都一样(32位4个字节,64位8个字节) package main import ( "fmt" "unsafe" ) func main() { var p1 *int; var p2 *floa
Go 语言中的结构体和 C 语言中结构体一样,都是用来保存一组 不同类型的数据 Go 语言中的结构体和 C 语言中结构体一样,都需要先定义结构体类型再利用结构体类型定义结构体变量 定义结构体类型 type 类型名称 struct{ 属性名称 属性类型 属性名称 属性类型 ... ... } type Studentstruct { name string age int
map 翻译过来就是字典或者映射,可以把 map 看做是切片的升级版 切片是用来存储一组相同类型的数据的,map也是用来存储一组相同类型的数据的 在切片中我们可以通过索引获取对应的元素,在 map 中我们可以通过key获取对应的元素 切片的索引是系统自动生成的,从0开始递增,map 中的 key 需要我们自己指定 只要是可以做 ==、!= 判断的数据类型都可以作为 key(数值类型、字符串、数组、
和 C 语言一样,Go 语言中也有数组的概念,Go语言中的数组也是用于保存一组相同类型的数据 和 C 语言一样,Go 语言中的数组也分为一维数组和多维数组 一维数组 格式:var arr [元素个数]数据类型 和 C 语言中数组不同,Go 语言中数组定义之后就有默认的初始值 默认初始值就是保存数据类型的默认值(零值) package main import "fmt" func main()
golang 里面有两个保留的函数: init 函数(能够应用于所有的 package) main 函数(只能应用于 package main) 这两个函数在定义时不能有任何的参数和返回值 go 程序会自动调用 init() 和 main(),所以你 不能 在任何地方调用这两个函数 package main 必须包含一个 main 函数,但是每个 package 中的 init 函数都是可选的 一
Go 语言中没有提供其它面向对象语言的析构函数,但是 Go 语言提供了 defer 语句用于实现其它面向对象语言析构函数的功能 defer 语句常用于 释放资源、解除锁定 以及 错误处理 等 例如C语言中我们申请了一块内存空间,那么不使用时我们就必须释放这块存储空间 例如C语言中我们打开了一个文件,那么我们不使用时就要关闭这个文件 例如C语言中我们打开了一个数据库, 那么我们不使用时就要关闭这个数
闭包是一个特殊的匿名函数,它是匿名函数和相关引用环境组成的一个整体 也就是说只要匿名函数中用到了外界的变量,那么这个匿名函数就是一个闭包 package main import "fmt" func main() { num := 10 a := func() { num++ // 在闭包中用到了main函数中的num, 所以这个匿名函数就是一个闭包