# go-study **Repository Path**: zpp100vip/go-study ## Basic Information - **Project Name**: go-study - **Description**: golang - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-08-21 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # go-study ## 变量 > 字符'�' 字符'�'的 Unicode 代码点是U+FFFD。它是 Unicode 标准中定义的 Replacement Character,专用于替换那些未知的、不被认可的以及无法展示的字符。 ### string 一个string类型的值在底层就是一个能够表达若干个 UTF-8 编码值的字节序列 ## 枚举 关键字 `iota` 定义常量组中从 0 开始按⾏行计数的⾃自增枚举值。 ## 引用类型 内置函数 `new` 计算类型⼤大⼩小,为其分配零值内存,返回指针。 `make`会被编译器翻译成具体的创建函数,由其分配内存和初始化成员结构,返回对象⽽而⾮非指针。 make用于内建类型(map、slice、channel)的内存分配 ## 切片 切片属于引用类型。它的零值即为nil。 > 容量 为它的第一个元素值在其底层数组中的索引值与该数组长度的差值的绝对值。 ``` //[4:6:8]:8为切片上限索引,也是原数组的索引位置 var numbers4 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} slice5 := numbers4[4:6:8] ``` ## 通道 goroutine间的通信方式 > 非缓冲的通道 ``` //初始化 make(chan int, 0) ``` 发送方在向通道值发送数据的时候会立即被阻塞,直到有某一个接收方已从该通道值中接收了这条数据。 ## defer 当一个函数中存在多个`defer`语句时,它们携带的表达式语句的执行顺序一定是它们的出现顺序的倒序。 ## 接口 `接口之间赋值`,方法多的接口可以赋值给方法少的接口。 ## 锁 ### 互斥锁 `sync.Mutex`类型是一个结构体类型,属于值类型中的一种。把它传给一个函数、将它从函数中返回、把它赋给其他变量、让它进入某个通道都会导致它的副本的产生。 如果你把一个互斥锁作为参数值传给了一个函数,那么在这个函数中对传入的锁的所有操作,都不会对存在于该函数之外的那个原锁产生任何的影响。 ## Map(字典) 并发安全字典对键的类型要求,不能是函数类型、字典类型和切片类型。(这些键值的实际类型只有在程序运行期间才能够确定) ## 原子操作 首次真正使用原子值后,原子值就不应该再被复制了 其次,原子值的Store方法对其参数值(也就是被存储值)有两个强制的约束。一个约束是,参数值不能为nil。另一个约束是,参数值的类型不能与首个被存储值的类型不同。也就是说,一旦一个原子值存储了某个类型的值,那它以后就只能存储这个类型的值了。 ## Context Context类型可以提供一类代表上下文的值。 同步工具、并发安全 ## 同步工具 1. sync/atomic.Value 2. sync.Once 3. sync.WaitGroup 4. context.Context 5. sync.Pool # 测试 文件名,被测源码文件的主名称为前缀,以`_test.go`结尾 对于功能测试函数来说,其名称必须以Test为前缀,并且参数列表中只应有一个*testing.T类型的参数声明。 对于性能测试函数来说,其名称必须以Benchmark为前缀,并且唯一参数的类型必须是*testing.B类型的。 对于示例测试函数来说,其名称必须以Example为前缀,但对函数的参数列表没有强制规定。 ## 功能测试 ``` # string/s2 go test [包的路径] ``` ## 性能测试 ``` ## string s4 # -run=^$,不执行任何功能测试函数 go test -bench=. -run=^$ [包的路径] ```