![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go
AcTarjan
冲冲冲!!!
展开
-
sync包
sync.WaitGroup用于等待线程结束sync.Pool用于从对象池中获取对象,避免反复创建和销毁对象sync.Mutex普通锁:持有锁时,继续获取锁会阻塞sync.RWMutex读写锁:读锁定时,可以继续读,不允许写;写锁定时,不允许读写sync.Cond用于事件同步(即满足拓扑序)//等待信号c.L.Lock()c.Wait()c.L.Unlock()sync.Map协程安全的mapsync.Once只会调用1次方法...原创 2022-02-22 14:21:36 · 228 阅读 · 0 评论 -
Go——json
序列化进行序列化的对象中只有首字母大写的字段会进行序列化反序列化反序列化的对象与实际json对象不完全一致反序列化的对象比实际json对象多字段或少字段都能反序列化成功反序列化的对象中含有interface{}package mainimport ( "encoding/json" "fmt" "reflect")type object struct { //反序列化的对象 Code interface{} `json:"code"` Msg interface{}原创 2022-05-26 10:11:07 · 98 阅读 · 0 评论 -
多协程编程
变量安全当多个协程读写同一个变量时,很可能会造成冲突。常见的解决办法就是加锁(可见sync.Mutex),如下所示。当这中写法就比较繁琐,一个变量配一把锁,当然也可以多个变量配一把锁,这样会导致冲突增多,影响性能另一种解决办法是golang提供的atomic包,包中的函数都是原子操作,也就是安全的,写法也更简单var count int64//加锁var mutex sync.Mutexmutex.Lock()count += 1mutex.Unlock()//atomicat原创 2022-05-13 09:27:29 · 141 阅读 · 0 评论 -
Go语法易错点
iota//iota在遇到const关键字时会被置0const ( a = 1 //a=1 iota=0,,,, b //b=1 iota=1, 这是一种简写形式,b的右值等于上一行的右值, c = iota //c=2 iota=2 d //d=3 iota=3,)const ( aa = iota )原创 2022-03-18 10:25:38 · 187 阅读 · 0 评论 -
Go设计模式
创建型模式工厂模式package mainimport "fmt"type vehicle interface { run()}type Factory struct {}func (f *Factory) GetVehicle(v string) vehicle { switch v { case "CAR": return new(car) case "BIKE": return new(bike) default: return new(car) }}原创 2022-03-09 11:39:40 · 230 阅读 · 0 评论 -
gdb调试
流程#加载go运行时支持文件runtime-gdb.py#文件在go安装目录的src/runtime/下### 方法1(每次使用gdb自动加载) 修改~/.gdbinit文件,添加一行:add-auto-load-safe-path /opt/go/src/runtime/runtime-gdb.py### 方法2(每次进入gdb都要加载一次) 在gdb界面执行如下命令:(gdb) source /opt/go/src/runtime/runtime-gdb.py#编译程序go buil原创 2022-02-18 15:53:35 · 228 阅读 · 0 评论 -
golang易错点
Reader从Reader中读出数据,Reader里的数据会减少chan给一个 nil channel 发送数据,造成永远阻塞从一个 nil channel 接收数据,造成永远阻塞关闭一个nil channel会触发panic关闭一个已关闭的管道会触发panic向一个已关闭的管道写入数据会触发panic从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值无缓冲的channel是同步的,而有缓冲的channel是非同步的sync.WaitGroupfunc原创 2022-02-17 09:03:28 · 182 阅读 · 0 评论 -
database/sql
官方database包介绍介绍在Go中访问数据库,需要使用sql.DB类型用于创建语句和事务,执行查询和获取结果一个sql.DB不是一个数据库连接,它是一个接口,是一个数据库的抽象sql.DB通过驱动程序打开和关闭与实际底层数据库的连接并根据需要管理一个连接池导入数据库驱动官方提供的database包只是提供接口,没有指定任何具体数据库类型实现要使用 database/sql ,你需要该程序包本身以及要使用的特定数据库的驱动,驱动将自身注册为可用的 database/sql 包你通常不原创 2022-01-21 16:03:26 · 1389 阅读 · 0 评论 -
reflect包
golang的反射是通过reflect包来完成的,或者说是通过操作reflect包内的Type和Value两个结构体来完成的TypeValue函数介绍//Valueof 返回一个以reflect.Value表示的i,这是使用值反射的入口reflect.Valueof(i interface) Value//Interface 返回Value的Interface{}表示,会重新分配内存,然后可以强转成某种类型//Interface 注意:如果接收者是通过访问未导出字段获得的,将会panic.原创 2022-01-17 15:03:42 · 290 阅读 · 0 评论 -
Go编码规范
Go官方编码规范命名对于文件名,应一律小写,不同单词之间用下划线分隔对于变量,采用驼峰命名法。专有名词大小写要一致,例:可以 URL 或 url ,而不要 Url 。变量名应该尽可能短,尤其是局部变量。对于一些特殊的变量以及全局变量,可能需要对它有更多的描述,可以使用长命名对于interface,名字应以er结尾,优先使用标准库中已经存在的接口对于结构体,注意字段的导出性,首字母大写的字段可导出Getter: obj.Xxx()Setter: obj.SetXxx(xxx type)对于接原创 2022-01-14 15:27:33 · 401 阅读 · 0 评论 -
go_关键字
switch寻找匹配的case,执行完后即退出switchfunc judgeType(i interface{}) { switch i.(type) { case bool: fmt.Println("bool") case int: fmt.Println("int") case string: fmt.Println("string") default: fmt.Println("unknown") }}selectselect只能用于channel的操原创 2021-11-10 10:08:02 · 188 阅读 · 0 评论 -
go常用命令
配置相关go env #查看go环境变量包相关编译相关原创 2021-11-03 14:20:30 · 80 阅读 · 0 评论 -
Go_strings包
strings.Contains(str,substr) //判断str中是否包含substr strings.ContainsRune(str,ch) //判断str中是否包含字符ch strings.ContainsAny(str,chars) //判断str中是否包含字符串chars中的任一字符 strings.HasPrefix(str,prefix) //判断str是否以prefix为前缀(若prefix为空,返回true strings.HasSuffix(st.原创 2021-08-10 17:55:18 · 147 阅读 · 3 评论 -
Go_map
//创建map//方法1:var m1 map[string]intm1 = make(map[string]int)//方法2:m2 := make(map[string]bool)//向map中插入数据m1["fish"] = 12m1["chicken"] = 15//删除map中的数据delete(m1,"fish")//遍历mapfor key,val := m1{ fmt.Println(key,val)}//判断key是否存在val,ok :=.原创 2021-08-09 18:37:11 · 52 阅读 · 0 评论 -
Go_Slice
Slice即切片,相当于C++中的可变长数组或动态数组 append函数:在数组后添加数据,如果超出数组容量,则自动增加容量 copy函数:将数组1的数据复制到另一个数组2,如果数组2的长度较小,则只会复制数组1的前一部分;如果数组2的长度较大,则数组2后面的数据不变 //创建切片//方法1:相当于vectorvarslice1[]int//此时slice1=nil,len(slice)=0//方法2:相当于newslice2:=...原创 2021-08-09 18:35:51 · 84 阅读 · 0 评论 -
Go_struct
//定义结构体Persontype Person struct { name string age int married bool}//创建结构体var p1 Personvar p2 = Person{"Bob",12,false}p3 := Person{age: 30,name: "Tom",married: true}//结构体指针var ptr1 *Personvar ptr2 = &p2ptr3 := &p3//修改数据ptr1.原创 2021-08-09 17:52:09 · 86 阅读 · 0 评论 -
Go_fmt包
Scan()、Scanln()、Scanf()与Print()、Println()、Printf()数据输入或输出:标准输入(键盘)与标准输出(控制台)Scan():根据空格或换行分隔数据Scanln():根据换行分隔数据Scanf():根据指定格式读取数据Print():向控制台输出数据Println():会在输出数据后增加换行Printf():按照指定格式输出数据package mainimport "fmt"func main() { var name string v原创 2021-08-04 18:05:36 · 314 阅读 · 0 评论 -
Go_数据类型
整型bool:值只可以为常量true或常量false,默认为falseint:32位或64位uint:32位或64位uintptr:无符号整型,用于存放一个指针uint8:0 ~ 255uint16:0 ~ 65535uint32:0 ~ 4294967295uint64:0 ~ 18446744073709551615int8:-128 ~ 127int16:-32768 ~ 32767int32:-2147483648 ~ 2147483647int64:-9223372036原创 2021-07-20 15:53:54 · 211 阅读 · 0 评论 -
Go_变量
变量命名由数字、字母或下划线组成,且首字符不能是数字变量声明var 变量名 变量类型变量名 := 变量值(这种方式只能被用在函数体内,而不可以用于全局变量的声明与赋值)var a1 int //声明一个变量a1var a2 int = 1 //声明变量a2并赋值var b1,c1 int8 //声明变量b1和c1var b2,c2 int8 = 2,3 //声明变量b2和c2并赋值var d,e,f = 1,"你好",3.3 //声明变量d、e、f并根据值确定变原创 2021-07-20 16:22:01 · 63 阅读 · 0 评论