golang踩的坑

golang原生程序

  1. fatal error:concurrent map read and map write错误?

如果原生的map由于多个goroutine读写就会引发此错误。因为map为引用类型,所以即使函数为值传递,参数副本依然指向引用值,所以多个goroutine并发读写一个引用值就会产生对资源的竞争而生产对资源的破坏。

解决方案1:把map当做一个属性封装一个结构体使用sync.Mutex读锁,struct内部提供操作map的方法,并不直接对外暴露,每次方法修改都进行加锁处理。

解决方案2:同1,把sync.Mutex换为sync.RwMutex读写锁。

解决方案3:把map换为sync.Map使用,不过使用不当会引发问题2。

  1. sync.Map没有Load到值与Delete不掉问题?

sync.Map时使用Delete与Load方法的key值必须与Store时一至,不然会找不到。这是因为sync.Map存储的是interface{}与interface{}类型,如果key为uint8(7)来Store,而用7去Delete与Load的话,golang会把7默认为int类型从而跟uint8(7)对应不上造成找不到值的问题。

解决方案:在使用sync.Map里用什么类型Store就用什么样的类型来Load与Delete。即使用uint8类型存就用uint8类型取。

  1. math/rand.Rand结构体随机数并发随机问题?

rand.Rand结构体里的随机数生成没有加锁机制在多个goroutine时可能随不出随机数。

解决方案:直接使用rand包里提供的方法,这几个是rand里的内部结构体在生成随机数的时候有锁机制。

  1. net/TCPConn读出的流转json失败问题?

TCPConn在Socket读流的时候会有一个最大限制,当单个消息体过大的时候一次性只能读到上限,而造成读出来的信息不是一个完整的包体,在json解析的时候因转json格式不正确造成转json失败。

解决方案:根据前几个byte流的大小来确定整个包体的大小,自己设置一个一次性读流的限制,如果包体没有达到这个限制就一次性读出来,超过这个限制就多读几次,直到读完为止。

  1. interface强转某个类型宕机问题?

golang中强转类型如果只用一个结果接收的话很可能会出现宕机的情况。 解决方案: 接收时用两个参数接收,一个接收数值,一个接收结果。

  1. goroutine时报错程序退出问题?

goroutine里的程序出错时程序会因为错误而崩掉异常退出。

解决方案:在goroutine的方法里使用recover方法来捕捉异常,把出异常用defer执行的方法输出到日志文件里,来做记录。recover方法是用来防止程序崩掉退出,defer是用来在程序出异常过程中操行把错误写到日志文件里。

  1. map[string]interface{}设置常量转换int64报错问题?

golang中数值常量是按int类型存储在interface{}中。

解决方案:在map[string]interface{}中得到数值转换时要按int来进行转换。或者在设置的时候把interface{}设置为int64类型。

  1. interface强转某个类型宕机问题?

golang中强转类型如果只用一个结果接收的话很可能会出现宕机的情况。

** 解决方案:** 接收时用两个参数接收,一个接收数值,一个接收结果。

  1. 如何打印程序的汇编调用代码?

go tool compile -S -N -l main.go

  1. 如何进行变量逃逸分析?

go build -gcflags="-m" main.go 出现:moved to heap: t表示此变量由栈上逃到堆上。

  1. 如何在诊断延迟,并行化和竞争异常等性能问题?

go tool trace可以实现trace是个web ui程序trace命令已经自带。trace可以提供程序运行时长、多少goroutines运行872微秒、进程何时升级到使用第三个os线程、什么时候高用qSortPar等等 使用go tool trace需要导入runtime/trace包在main函数加入以下代码:

f, err := os.Create("trace.out")	
if err != nil {		
  panic(err)
}	
defer f.Close()
err = trace.Start(f)
if err != nil {
 	panic(err)
}	
defer trace.Stop()

编译运行后使用go tool trace trace.out执行生成的trace.out文件。在控制台找Opening browser. Trace viewer is listening on http://127.0.0.1:17369 访问这个地址

备案号:豫ICP备14002392号-2