3-基本数据类型
3 基本数据类型基本数据类型包括:整型、浮点型、布尔型、字符串。 除以上基本类型之外,还有 数组、切片、结构体、函数、map、通道 等。 3.1 整型3.1.1 整型整型分为:int8、int16、int32、int64 ,以及对应的无符号整型:uint8、uint16、uint32、uint64 其中 unit8 对应其他语言中的 byte 类型;int16 对应 C 语言中的 short 类型;int64 对应 C 语言中的 long 类型。 各数据类型及对应的取值关系如下:  特殊整型:  注意: 获取对象的长度时,内建的 len() 函数返回的长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以直接使用 int 来表示 。 3.1.2 八进制...
5-运算符
5 运算符go 语言中内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 5.1 算数运算符+、-、*、/、% 5.2 关系运算符==、!=、>、<、>=、<= 5.3 逻辑运算符&&、||、! 5.4 位运算符位运算符对证书在内存中的二进制位进行操作。 运算符 描述 & 参与运算的两数各对应的二进位相与(两位均为1才为1) ` ` ^ 参与运算的两数各对应的二进制位相异或(两位不一样时为1) << 左移 n 位就是乘以 2 的 n 次方。a<<b 是把 a 的各二进制位全部左移 b 位,高位丢弃,低位补 0 >> 右移 n 位就是除以 2 的 n 次方。a>>b 是把 a 的各二进制位全部右移 b 位。 1234func main() { // 5 的二进制数:101 ,2 的二进制 010,相与之后得到 000 fmt.Println(5...
6-数组
6 数组6.1 数组的定义数组在定义时就需要声明其元素数量和类型: 12// T 即元素类型var 数组变量名 [元素数量] T 如:var a [5]int. 数组的长度必须是常量,并且长度是数组类型的一部分,一旦定义,长度不能变。所以,[5]int 和 [10]int 是不同的类型。 1234567891011package mainimport "fmt"func main() { var a [3]bool var b [6]bool // a的类型是-[3]bool,b 的类型是-[6]bool fmt.Printf("a的类型是-%T,b 的类型是-%T", a, b)} 数组可以通过下表进行访问,下标从 0 开始,最后一个元素下标为:len-1 6.2 数组的初始化6.2.1 方式1——通过初始化列表设置值1234567891011121314151617package mainimport "fmt"func main() { // 未初始化时,元素取类型默认值(零值):...
8-指针和make和new
8 指针、make、new8.1 指针(pointer)Go 语言中没有指针操作,只需要记住两个符号即可: & 取内存地址 * 根据地址取值 12345678910111213141516package mainimport "fmt"func main() { a := 18 // 获取 a 的地址值并复制给 p p := &a // p 的类型:*int,p 的取值:0xc000018078 fmt.Printf("p 的类型:%T,p 的取值:%v\n", p, p) b := *p // b 的类型:int,b 的取值:18 fmt.Printf("b 的类型:%T,b 的取值:%v\n", b, b)} 指针传值示例: 1234567891011121314151617181920212223package mainimport "fmt"func main() { a := 10 modify1(a) // 10 fmt.Println...
7-切片
7 切片由于数组的长度时固定的且数组的长度属于类型的一部分,所以数组有很多局限性。如: 1234567func arrSum(x [3]int)int{ sum :=0 for _, v := range x { sum += v } return sum} 上述代码中,只能接受 [3]int 类型,其他的都不支持。再比如: 1x := [3]int{1,2,3} 上述代码中,数组 x 中已经有 3 个值了,我们无法再继续向其中添加新的元素了。 基于数组的如上缺陷,我们就需要使用 切片(slice) 切片是一个相同类型元素的可变长度的序列。它是基于数组类型的一种封装。 切片是一个引用类型,它的内部结构包括:地址、长度、容量。切片多用于快速操作一块数据集合。 7.1 切片的定义7.1.1 基本定义格式声明切片类型的基本语法如下: 1var name [] T 其中: name 是变量名 T 表示切片中的元素类型 [ ] 内不需要声明长度 切片是引用类型,所以两个切片无法直接进行比较,切片只能和 nil 做比较。...
9-map
9 mapGo 语言中提供的映射关系容器为 map ,其内部使用 散列表(hash) 实现。它是一种无序的基于 key-value 的数据结构。 Go 语言中的 map 是引用类型,必须初始化之后才能使用。 9.1 map 定义Go 语言中 map 的定义语法为:map[keyType]valueType,其中: keyType 表示键的类型 valueType 表示值的类型 map 类型变量默认初始值为 nil (引用类型的默认初始值都为 nil), 需要使用 make() 函数来分配内存,语法格式为: 1make(map[keyType]valueType , cap ) 上述格式中,cap 表示 map 的容量,不是必须的,map 可以动态扩容。但我们通常会在初始化的时候就指定一个合适的容量,因为这样会比动态扩容的执行效率高。 12345678910111213141516171819package mainimport "fmt"func main() { // 声明一个键为 string 类型,值为 int 类型的 map var b...
17-并发编程
基于原文 Go语言基础之并发 和 视频 93-111 整理。 17 Go语言中的并发编程并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因。 17.1 并发与并行 并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天,一个主体同一时间做多个任务)。 并行:同一时刻执行多个任务(你和你朋友都在用微信和女朋友聊天,多个主体同一时间做多个任务)。 Go 语言的并发通过 goroutine 实现。goroutine 类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个 goroutine 并发工作。goroutine 是由 Go 语言的运行时(runtime)调度完成,而线程是由操作系统调度完成。 Go 语言还提供 channel 在多个 goroutine 间进行通信。 goroutine 和 channel 是 Go 语言秉承的 CSP(Communicating Sequential Process)并发模式的重要实现基础。 17.2 goroutine在 java/c++ 中我们要实现并发编程的时候...
29-Context
原文链接 视频链接:147-148 在 Go http 包的 Server 中,每一个请求都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和 RPC 服务。用来处理一个请求的 goroutine 通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的 token、请求的截止时间。 当一个请求被取消或超时时,所有用来处理该请求的 goroutine 都应该迅速退出,然后系统才能释放这些 goroutine 占用的资源。 1. 为什么需要Context1.1. 基本示例1234567891011121314151617181920212223242526272829package mainimport ( "fmt" "sync" "time")var wg sync.WaitGroup// 初始的例子func worker() { for { fmt.Println("worker") ...
20-单元测试
原文:Go语言基础之单元测试 和 视频 122-124 不写测试的开发不是好程序员。我个人非常崇尚 TDD(Test Driven Development)的,然而可惜的是国内的程序员都不太关注测试这一部分。 这篇文章主要介绍下在 Go 语言中如何做单元测试和基准测试。 20.1 go test 工具Go 语言中的测试依赖 go test 命令。编写测试代码和编写普通的 Go 代码过程是类似的,并不需要学习新的语法、规则或工具。 go test 命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以**_test.go**为后缀名的源代码文件都是 go test 测试的一部分,不会被 go build 编译到最终的可执行文件中。 在 *_test.go 文件中有三种类型的函数:单元测试函数、基准测试函数和示例函数。 类型 格式 作用 测试函数 函数名前缀为 Test ,测试程序的一些逻辑行为是否正确 基准函数 函数名前缀为 Benchmark,测试函数的性能 示例函数 函数名前缀为 Example,为文档提供示例文档 go test ...
4-流程控制
4 流程控制和运算符Go 语言中常用的流程控制有 if 和 for。而 switch 和 goto 主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制。 4.1 if 语句4.1.1 if 语句的基本格式1234567if 表达式1 { 分支1} else if 表达式2 { 分支2} else { 分支3} 4.1.2 if 的特殊写法12345678// 此处声明的变量 score 只在 if 语句中有效if score := 65; score >= 90 { fmt.Println("A")} else if score > 75 { fmt.Println("B")} else { fmt.Println("C")} 4.2 for 语句go 语言中所有的循环类型都可以使用 for 关键字来完成。 4.2.1 for 基本格式123for 初始语句; 条件表达式;...














