<p class="ql-block">适用于处理高并发场景</p><p class="ql-block"><span style="color:rgb(22, 126, 251);">import "fmt"</span><span style="color:rgb(237, 35, 8);">→输出输入包</span></p><p class="ql-block"><span style="color:rgb(237, 35, 8);">fmt.Println</span>("")→打印</p><p class="ql-block">var 变量名 类型 = "数据"</p><p class="ql-block">可以在打印输出中(变量名,)直接输出数据</p><p class="ql-block">bool(ean)=布尔</p><p class="ql-block">float64=浮点数类型</p><p class="ql-block">import (一行一个包,分别双引号包住)→导入多个包[拒绝导入未使用的包]</p><p class="ql-block">func init(){→初始化函数</p><p class="ql-block">[变量和包定义后不使用会编译错误]</p><p class="ql-block">变量名 := 数据→短变量声明[只能在函数中使用]</p><p class="ql-block">默认值→0,false,0.0, 空字符串</p><p class="ql-block">变量声明var(一行一个声明不用逗号)</p><p class="ql-block">局部变量在函数内部,全局变量在外部</p><p class="ql-block">const→常量赋值</p><p class="ql-block">iota=微量→特殊常量[从0开始,每定一个常量就加1]</p><p class="ql-block">const(定义多个常量名换行)</p><p class="ql-block">uint8→无符号的0-255整数</p><p class="ql-block">float32→单精度浮点数</p><p class="ql-block">float64→双精度浮点型</p><p class="ql-block">int8,16,32,64→代替short,long之类的</p><p class="ql-block">complex64=float32*2</p><p class="ql-block">complex128=float64*2</p><p class="ql-block">complex=费解的;复合的</p><p class="ql-block">反引号包裹的字符串不处理转义符</p><p class="ql-block">fmt.Sprintf("%类型首字母",对应变量名)</p><p class="ql-block">(len(变量名))→字节数</p><p class="ql-block">每个中文字符占三个字节</p><p class="ql-block">utf8.RuneCountInString(变量名)→字符数</p><p class="ql-block">if 变化 {反应</p><p class="ql-block">for 初始化; 条件判断; 迭代{</p><p class="ql-block">for 索引, 值 := range 集合名{→遍历集合</p><p class="ql-block">省略索引部分用_占位</p><p class="ql-block">continue→一符合条件就跳过剩余部分</p><p class="ql-block">break→立即结束</p><p class="ql-block">goto+标签名→执行流程跳转到当前函数内标签</p><p class="ql-block">标签名:→跳转到此位置</p><p class="ql-block">goto→方便跳出for循环</p><p class="ql-block">var 数组名 [个数]类型{数据}</p><p class="ql-block">个数可以为省略号让Go自动计算长度</p><p class="ql-block">slice=切片→数组抽象</p><p class="ql-block">数组名[1:3]→包含1不包含3索引</p><p class="ql-block">slice := make([]类型, 长度, 容量)</p><p class="ql-block">不设置容量→容量等于长度</p><p class="ql-block">cap→容量 len→长度</p><p class="ql-block">low=低的 </p><p class="ql-block">(slice, element)=追加切片的元素</p><p class="ql-block">合并切片:= (slice1, slice2...)</p><p class="ql-block">copy(目标切片, 原切片 []Type)</p><p class="ql-block">copy=复制</p><p class="ql-block">var集合名 map[键类型]值类型</p><p class="ql-block">集合名= make(map[键类型]值类型)→初始化后才可以赋值</p><p class="ql-block">delete(集合名, "键名")</p><p class="ql-block">nil=无;不存在的加map→不能存储键值</p><p class="ql-block">m["键名"] = 值名</p><p class="ql-block">value, exists := m["键名"]→查找键名是否存在</p><p class="ql-block">for key, value := range 键名{→遍历键,值</p><p class="ql-block">sync=同步</p><p class="ql-block">Store=储存 load=装载;大量</p><p class="ql-block">type 结构名 struct {→结构名首字母大写可被其他包访问</p><p class="ql-block">Location=位置=Point=address</p><p class="ql-block">匿名字段可以让结构体继承该类型的所有方法和字段→匿名字段可以变成结构体来用作包含引用在字段所在的结构体</p><p class="ql-block">ptr := &结构体名[指向结构体名的指针ptr]</p><p class="ql-block">func 函数名(参数列表) 返回值类型 { 函数体 }</p><p class="ql-block">(nums ...int)→可变参数[任何数]</p><p class="ql-block">defer=推迟→在行前加会推迟运行</p><p class="ql-block">多个defer,先下后上[后进先出]</p><p class="ql-block">*ptr=指针指向的值</p><p class="ql-block">双*等于指针的指针</p><p class="ql-block">modify=修改</p><p class="ql-block">interface 接口名 {方法名()类型</p><p class="ql-block">结构体实现接口</p><p class="ql-block">Perimeter()=周长</p><p class="ql-block">指针接收者可以修改接收者的值,值接收者不行→*</p><p class="ql-block">receiver=接收器</p><p class="ql-block">值类型receiver不会改变原对象状态→对象副本;指针类型能改变原对象状态→对象地址.</p><p class="ql-block">结构体嵌入了另一个结构体,这个就拥有了另一个结构体的字段→复用方法</p><p class="ql-block">🍵Retriever=猎犬;迂回者</p><p class="ql-block">🍵Golden=金色</p><p class="ql-block">T 是类型参数,comparable 是类型约束,表示 T 必须是可比较的类型.</p><p class="ql-block">any=任何;→任意类型</p><p class="ql-block">T后可空格加所需要的各种类型</p><p class="ql-block">contains(切片名,元素)→是否包含</p><p class="ql-block">elem=元素</p><p class="ql-block">routine=常规;惯例</p><p class="ql-block">channel=引导;传输→使用后必关</p><p class="ql-block">Letters=信件</p><p class="ql-block">scan=扫描</p><p class="ql-block">goroutine→go</p><p class="ql-block">time.Sleep(500 * time.Millisecond)=等待毫秒</p><p class="ql-block">WaitGroup→sync中的等待执行</p><p class="ql-block">创建一个整数类型通道</p><p class="ql-block"> ch := make(chan int)</p><p class="ql-block">启动一个goroutine向通道发送数据</p><p class="ql-block"> <span style="color:rgb(22, 126, 251);">go func() {</span></p><p class="ql-block"><span style="color:rgb(22, 126, 251);"> ch <- </span><span style="color:rgb(57, 181, 74);">42</span></p><p class="ql-block"><span style="color:rgb(22, 126, 251);"> }()</span></p><p class="ql-block">从通道接收数据</p><p class="ql-block"><span style="color:rgb(22, 126, 251);"> result := <-ch</span></p><p class="ql-block"><span style="color:rgb(22, 126, 251);"> fmt.Println(result) // 输出: </span><span style="color:rgb(57, 181, 74);">42</span></p><p class="ql-block">}</p><p class="ql-block">缓冲通道ch := make(chan int,缓冲区大小 )</p><p class="ql-block">channel=引导;传输→通道</p><p class="ql-block">"<-"→右边发向左边</p><p class="ql-block">select{case =选择→用于通道</p><p class="ql-block">case <-time.After(1 * time.Second):→超时</p><p class="ql-block">var wg sync.WaitGroup→创建等待实例</p><p class="ql-block"><span style="color:rgb(237, 35, 8);">wg.Add(1)→等待一个go</span></p><p class="ql-block">wg.Wait()→等待所有的都结束</p><p class="ql-block">defer=推迟</p><p class="ql-block">Done=完成的</p><p class="ql-block">defer wg.Done()→减少WaitGroup的次数</p>