7_结构和方法
结构和方法结构体工厂Go 中不支持向面向对象语言的方法那样构造类的子方法,但是可以根据构造子工厂的方法来实现子方法。一般来说,工厂的名字用 New 开头。 1234567891011type File struct { fd int name string}func NewFile(fd int, name string) *File { if fd < 0 { return nil } return &File{fd, name}} 如果结构体的命名开头是小写的话,可以强制要求使用结构体工厂。 匿名字段和内嵌结构体结构体可以包含一个或多个 匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型就是字段的名字。匿名字段本身可以是一个结构体类型,即 结构体可以包含内嵌结构体。 可以粗略地将这个和面向对象语言中的 继承 概念相比较,随后将会看到它被用来模拟类似继承的行为。Go 语言中的继承是通过内嵌或组...
6_Map
Map概念map 是引用类型,声明的方式一般如下: 123var map1 map[string]intcap := 20 // 容量 20map2 := make(map[string][]int, cap) k-v 操作 判断键值对是否存在 1234// 因为 Go 中的 key 不存在的情况下返回的 value 会是零值if _, ok := map1[key1];ok { // 存在} 删除一个键值对 123delete(map1, key1)// 如果 key 不存在也不会报错 相对于 Python 中的字典,Go 中对 Map 数据类型的操作显得更为友好。 遍历 Map123for idx, val := range map1 {}
5_数组与切片
数组与切片新建一个数组的方法1234aList [5]intbList = []int{1, 2}cList = []int{1: 1, 4: 2}dList = new([]int) 新建一个切片的方法12345slice := make([]int, 10)var slice []int = make([]int, 10)// 以下两种方式的效果是一样的slice := new([100]int)[0:50]slice := make([]int, 50, 100) make 函数的定义如下: 12func make([]type, len, cap)// len 为初始化时占用长度, cap 为可选参数容量 new 函数和 make 函数的区别: 主要功能都是在堆上面分配内存给需要的结构体。 new 函数为每个新的类型 T 分配一片内存,初始化为 0 并且返回 *T 的内存地址,这种申请方式会返回一个 T 类型初始值为 0 的指针。 make 函数返回一个类型为 T 的初始值,它只适用于创建 slice, map 和 chan...
4_函数
函数函数介绍Go 中的函数重载是被禁止的,即不能通过不同的参数传递执行同名函数的不同功能。 Go 中没有泛型的概念,因此它不支持那种支持多种类型的函数,不过大部分情况可以使用 interface 跟反射来实现相似的功能。 传递变长参数如果某个函数的最后一个参数采用 …type 的形式,那么这个函数就可以用来处理一个变长的参数,这个长度可以是 0,这样的函数称为变参函数。 12345func SampleFunc(prefix string, who ...string)SampleFunc("Hello", "world1", "world2", "world3") defer 和追踪关键字 defer 允许在 函数执行完之前或 return 执行完之后 推迟执行某一段代码,类似于其它语言中的 finally 关键字。 当有多个 defer 行为被注册时,它们会逆序执行(类似于栈) Go 的内置函数 名称 说明 close 用于关闭管道通信 len 返回某个类型的长度或者数量(...
3_控制结构
控制结构switch 结构Go 中的 switch-case 结构和 C++ 中的选择结构并不相同。 12345678i := 1switch i { case 0: func1() case 1: func2() // ... default: funcd()} 而 C++ 代码停止 switch 操作需要手动 break。 1234567i = 1switch(i) { case 1: func1(); break; case 2: func2(); break; //... default:funcd();} Go 中将这种特性去除,如果确实需要在执行完 case 的情况下还要继续执行,可以在后面添加关键字 fallthrough。如 Go代码: 1234567891011121314151617181920k := 6switch k {case 4: fmt.Println("was <= 4") fallthroughcase 5...
2_基本结构和基本数据类型
基本结构和基本数据类型文件名 文件名 正误 app.go 正确 start-app.go 错误 start_app.go 错误 标识符Go 的标识符与 C 的要求类似,比如不能数字开头、不能使用关键字等。但 Go 可以使用任何 utf-8 字符来命名标识符,因此甚至可以使用中文。 关键字 基本结构 变量与常量 var const 包管理 package import 基本组件 函数 func return 自定义类型 interface struct type 引用类型 map range 流程控制 并发 go chan select 单任务流程控制 单分支控制 if else 多分支流程 switch case default fallthough 循环流程 for break continue goto 延时型流程控制 defer 函数main() 函数是每个可执行程序的入口,一般来说是第一个执行的入口函数(如果有 init() 函数会考虑先执行)。 函数的简单格式 123func funct...
1_基础知识
基础知识本部分内容会囊括原书的 前言、Go 语言的起源发展和普及、安装与运行环境、编辑器、集成开发与其它工具 等内容,且会省略很多介绍性的内容。 Go RuntimeGo 编译器直接产生本地可执行的代码,但这些代码仍运行在 Go 的 runtime 当中。这个 runtime 类似于 JAVA 中用到的 JVM,负责管理包括内存分配、垃圾回收、栈处理、goroutine、channel、切片等。 类似的,Go 拥有类似与 JAVA 的垃圾回收机制(标记-清除回收器)用于自动的垃圾回收操作。但同样的,自动的垃圾回收机制并不能规避所有因为内存带来的问题,分配和回收内容都是消耗 CPU 资源的行为。 Go 的可执行文件大小要比对应的源码文件要大很多,说明 Go 的 runtime 嵌入到了每一个可执行文件中,相对于较大的文件大小,Go 编译出来的程序的部署要更加的方便,因为它只需要一个静态文件即可,而避免了像 Python 那样需要为不同版本的依赖甚至是软件额外处理的麻烦。 调试器fmt.Printf() 中的占位符说明 %+v 打印包括字段在内的实例完整信息 %#v 打印包括字段和限...
12_网络
网络TCP 服务器服务端代码 客户端代码 HTTP 服务器服务端代码 访问并读取页面数据(网络请求)客户端代码
11_协程与通道
协程与通道并发、并行和协程协程定义 并发:一个并发程序能在一个处理器或内核使用多个线程执行 并行:一个并行程序在某个时间点能使用多个处理器资源 goroutine 是根据一个或以上的线程的可用性,映射在它们之上;协程调度器在 Go 运行的时候就能完成对协程的调度。 goroutine 和 coroutine 的区别: goroutine 意味着并行,协程一般来说并不能这样 goroutine 通过信道来相互通信;coroutine 通过让出和恢复操作来通信 协程间的信道channel 的创建123456// var identifier chan datatypevar a chan stringa = make(chan string)// ORa := make(chan string) 通信操作符 <- 发送ch <- int1 用通道 ch 发送变量 int1 接收int2 = <- ch 12345678910111213141516171819202122232425262728293031package mainimport ( ...
10_错误处理及测试
错误处理及测试