几个golang面试题及解析

一、以下代码的输出内容为 答案 解析 考查defer和panic组合的情况,在有panic时,会先执行defer然后再把恐慌传递出去。 更多相关内容可查看defer常见的坑以及官方文档描述。 二、以下代码有什么问题 答案 解析 for循环使用stu遍历时,stu只是一个临时变量,遍历过程中指针地址不...
阅读全文

Golang sync.WaitGroup的用法

0x01 介绍 经常会看到以下了代码: 主线程为了等待goroutine都运行完毕,不得不在程序的末尾使用time.Sleep() 来睡眠一段时间,等待其他线程充分运行。对于简单的代码,100个for循环可以在1秒之内运行完毕,time.Sleep() 也可以达到想要的效果。 但是对于实际生活的大多...
阅读全文

Golang 内存逃逸分析

0x01 什么是逃逸 第一次听说逃逸是在雨痕学堂,一脸懵逼的百度了半天也没找到一个明确的说法,直到昨天在论坛上看到一篇关于变量逃逸的文章才明白。 因为函数都是运行在栈上的,在栈声明临时变量分配内存,函数运行完毕再回收该段栈空间,并且每个函数的栈空间都是独立的,其他代码都是不可访问的。但是在某些情况下...
阅读全文

Golang使用RemoteAddr()获取远程主机地址的注意事项

一、问题描述 http.Request下的方法RemoteAddr()可以获取客户端的地址和端口号,最近的一个项目中用到了这个方法。 使用过程中一直都没有什么问题,但是当项目上线之后就发现不管怎么获取ip,客户端地址都是127.0.0.1。 对于这个问题一直百思不得其解,最后搞了半天才发现是ngin...
阅读全文
Go pprof的使用 Golang

Go pprof的使用

一、概述 go的pprof工具可以用来监测进程的运行数据,用于监控程序的性能,对内存使用和CPU使用的情况统信息进行分析。 官方提供了两个包:runtime/pprof和net/http/pprof,前者用于普通代码的性能分析,后者用于web服务器的性能分析。 官方文档: https://golan...
阅读全文

Golang判断文件是否存在及递归创建文件夹

一、判断文件或文件夹是否存在 golang判断文件或者文件夹是否存在可以通过os.stat()方法和os.IsExist()方法来判断: 二、递归创建文件夹 递归文件夹用到os.MkdirAll()方法: 第一个参数是路径,第二个是权限。如果文件夹不存在就创建,存在则不做任何操作。 三、测试代码 在...
阅读全文

Golang中time.Parse和time.Format的时区问题

一、问题描述 在windows下,time.Parse()的时区和time.Format()的时区是一致的。 但是在linux环境下,time.Parse()的默认时区是UTC,time.Format()的时区默认是本地,两者如果不处理好就会导致错误。 输出: 很明显能看到两者的时区不同并且如果把两...
阅读全文

Golang defer的运行时机和遇到的坑

一、defer概述 defer是golang中独有的流程控制语句,用于延迟指定语句的运行时机,只能运行于函数的内部,且当他所属函数运行完之后它才会被调用。例如: 它会先打印出HelloWorld,然后再打印出HelloDefer。 一个函数中如果有多个defer,运行顺序和函数中的调用顺序相反,因为...
阅读全文

Golang redigo使用笔记(二):并发处理和连接池

一、并发问题 在redigo官方的文档描述中,Receive()方法是不支持多并发的,原文为: 而Do()方法是间接调用了Receive()方法,所以Do()方法也是不支持多并发的。我们可以用一段代码来验证这一点: 这里是一个函数,完成了一个简单的INCRBY命令,实现nKey + i功能,和正常情...
阅读全文