golang
wu
盼盼编程
这个作者很懒,什么都没留下…
展开
-
经典Golang语法50问!
前言Golang 这门语言想必大家都不陌生,现在也比较火,学习的人也比较多。作为一款性能还算不错的语言,现在很多大厂的新项目都选择了Golang。这期针对大家的疑惑,总结了大厂系列Golang语法50问,供大家面试和学习用,下面看一下提纲。1.使用值为nil的slice、map会发生啥允许对值为 nil 的 slice 添加元素,但对值为 nil 的 map 添加元素,则会造成运行时 panic。//map错误示例funcmain(){varmmap...原创 2021-03-26 20:55:24 · 2755 阅读 · 154 评论 -
golang逃逸分析
变量和栈有什么关系栈可用于内存分配,栈的分配和回收速度非常快。下面代码展示栈在内存分配上的作用,代码如下:func calc(a, b int) int { var c int c = a * b var x int x = c * 10 return x}代码说明如下:第 1 行,传入 a、b 两个整型参数。第 2 行,声明 c 整型变量,运行时,c 会分配一段内存用以存储 c 的数值。第 3 行,将 a 和 b 相乘后赋予 c。第 5 行原创 2021-01-24 07:29:35 · 480 阅读 · 9 评论 -
golang红包算法
import ( "fmt" "math/rand" "time")func main() { //初始10个红包, 10000元钱 count, amount := int64(10), int64(10000) //剩余金额 remain := amount //验证红包算法的总金额,最后sum应该==amount sum := int64(0) //进行发红包 for i := int64(0); i &l.原创 2021-01-24 07:28:14 · 796 阅读 · 13 评论 -
golang中的tar-gz
package mainimport ( "fmt" "os" "io" "archive/tar" "compress/gzip")func main() { // file write fw, err := os.Create("tar/lin_golang_src.tar.gz") if err != nil { panic(err) } defer fw.Close() // gzi.原创 2021-01-24 07:27:34 · 777 阅读 · 5 评论 -
协程和纤程
这个其实看vert.x会非常清楚vert.x里面有两个线程池(缺省)如果你自己不再开线程池的话一个是eventloop线程池,还有一个是worker thread pool线程池协程(coroutine)和纤程(fiber)的主要区别点在于:调度这两个单词都翻译得不错,coop协作,co就是协的词根,coroutine翻译成协程很巧妙fiber是纤维,翻译成纤程,对应的thread/线程,process/进程,这几个单词翻译得都比较巧妙说回coroutine和fibercorou原创 2021-01-24 07:26:52 · 1152 阅读 · 7 评论 -
golang垃圾回收
Go 开发者不需要写代码来释放程序中不再使用的变量和结构占用的内存,在 Go 运行时中有一个独立的进程,即垃圾收集器(GC),会处理这些事情,它搜索不再使用的变量然后释放它们的内存。可以通过runtime包访问 GC 进程。通过调用runtime.GC()函数可以显式的触发 GC,但这只在某些罕见的场景下才有用,比如当内存资源不足时调用runtime.GC(),它会在此函数执行的点上立即释放一大片内存,此时程序可能会有短时的性能下降(因为GC进程在执行)。如果想知道当前的内存状态,可以使用:/原创 2021-01-24 07:26:14 · 382 阅读 · 6 评论 -
for 循环迭代变量
简介for i, v := rangei,v都是只创建一次,然后循环中赋值。 循环的 Map,golang为避免开发者循环时问题,所以特意在循环中打乱排序 循环的数组,是在开始前的镜像,循环中添加或移除元素不改变其循环次数。 循环的 Map,由于其随机特性,循环中添加或移除元素不能确定是否改变循环次数捕获迭代变量这是在学习Go 程序设计中遇到的一个比较重要的一个警告。这是个 Go 语言的词法作用域规则的陷阱。看完之后感觉是真的一个比较让人疑惑困惑的地方。所以特地记录一下。由标题就可以原创 2021-01-24 07:25:28 · 1994 阅读 · 4 评论 -
golang密码加密解密
简介最近正在迁移自己的小项目,项目之前是基于Laravel5.5开发的。整个用户登陆也是基于框架的 Auth 包认证的。其中用户密码这块也是用到了PHP内置的函数password_hash,用它进行密码加密。而且 PHP 默认使用的 PASSWORD_BCRYPT 算法。在使用 Go 的迁移过程中需要认证密码,所以就把这个过程记录下来。使用下面的例子来说明如何使用 GObcrypt包来对你的密码进行 hash 和 salt 加密对于这个例子,我将创建一个控制台应用程序,用于演示如何获取用户输入的密码原创 2021-01-24 07:24:50 · 3767 阅读 · 0 评论 -
golang常用技巧
将 for-select 语法结构封装成函数如果需要中断 for-select 语法结构,通常是需要使用标签来实现的,示例如下:func main() {L: for { select { case <-time.After(time.Second): fmt.Println("hello") default: break L } } fmt.Prin原创 2021-01-24 07:24:18 · 589 阅读 · 4 评论 -
Go 永久阻塞的方法
简介我们经常需要让主 goroutine 处于永久阻塞状态,这样其他的 gorotine 就可以一直运行处理信息。下面我总结了几种可以实现永久阻塞的方法,其中大部分实例代码无法直接运行,因为 Go runtime 会检查所有 goroutine 并提示所有的 goroutine 都处于 deadlock,在实际使用中,我们添加具体的业务 goroutien 就可以运行了。死循环说到永久阻塞第一个想到的应该就是死循环。package mainfunc main() { for {原创 2021-01-24 07:23:47 · 1621 阅读 · 1 评论 -
golang常用命令
竞态检查器go run -race main.go编译反编译// 编译go build -gcflags="-S"go tool compile -S hello.gogo tool compile -N -S hello.go // 禁止优化// 反编译go tool objdump <binary>原创 2021-01-24 07:22:56 · 556 阅读 · 2 评论 -
cpu高速缓存
我们用 Go 写两个遍历两层 slice 的算法。var items = make([][]int32, 1000)func init() { for i := 0; i < 1000; i++ { items[i] = make([]int32, 1000) for j := 0; j < 1000; j++ { items[i][j] = rand.Int31n(2) } }}// 横向遍原创 2021-01-24 07:22:22 · 706 阅读 · 1 评论 -
nginx路由匹配
模式 含义location = /uri = 表示精确匹配只有完全相等才会匹配成功location ^~ /uri ^~ 表示对路由进行前缀匹配location ~ /uri ~ 表示对路由进行正则匹配location ~* /uri ~* 表示对路由进行不区分大小写的正则匹配location /uri 不带任何修饰符也表示前缀匹配location / 默认匹配,任何没有匹配到的uri多个 location 配置的情况下匹配顺序为(匹配到某一等级就结束,同一规则时匹配.原创 2021-01-24 07:21:13 · 1579 阅读 · 3 评论 -
golang内存对齐
内存对齐的作用平台原因(移植):不是所有的硬件平台都可以访问任意位置上的任意数据的,有些硬件只能在特定位置取特定数据。 性能问题:经过内存对齐,CPU的内存访问速度会提升。因为对齐的元素只需要一次内存访问,未对齐的需要两次。性能问题一般程序员会认为内存如下图所示,是有一个个的字节组成,而CPU却不是这样看待的。CPU把内存当作一块一块的,块的大小可以是2、4、8、16字节大小,因此CPU读取内存是一块一块读取的。(块的大小称为内存读取粒度)假设CPU要读取一个int型4字节大小的原创 2021-01-24 07:20:37 · 433 阅读 · 2 评论 -
go clean
执行go clean命令会删除掉执行其它命令时产生的一些文件和目录,包括: 在使用go build命令时在当前代码包下生成的与包名同名或者与Go源码文件同名的可执行文件。在Windows下,则是与包名同名或者Go源码文件同名且带有“.exe”后缀的文件。 在执行go test命令并加入-c标记时在当前代码包下生成的以包名加“.test”后缀为名的文件。在Windows下,则是以包名加“.test.exe”后缀为名的文件。我们会在后面专门介绍go test命令。 如果执行go cle原创 2021-01-24 07:13:22 · 1120 阅读 · 2 评论 -
go build
-a: 强行对所有涉及到的代码包(包含标准库中的代码包)进行重新构建,即使它们已经是最新的了。 |-n | 打印编译期间所用到的其它命令,但是并不真正执行它们。 |-p n | 指定编译过程中执行各任务的并行数量(确切地说应该是并发数量)。在默认情况下,该数量等于CPU的逻辑核数。但是在`darwin/arm`平台(即iPhone和iPad所用的平台)下,该数量默认是`1`。 |-race | 开启竞态条件的检测。不过此标记目前仅在`linux/amd64`、`freebsd/amd64`、`.原创 2021-01-24 07:12:45 · 1171 阅读 · 3 评论 -
gometalinter代码检查
简介gometalinter工具可以检查Go代码中一些隐蔽的错误。go的编译器有的时候仅仅是能检查语法层面的错误,而不能检测出逻辑的错误。所以就需要一些额外的错误检查工具来进行代码检测。该工具基本上集成了目前市场上所有的检测工具,然后可以并发的帮你静态分析你的代码gometalinter 集成go语言几乎所有检测工具,静态分析代码,包含功能如下go vet -工具可以帮我们静态分析我们的源码存在的各种问题,例如多余的代码,提前return的逻辑,struct的tag是否符合标准等。go t原创 2021-01-22 21:40:08 · 1181 阅读 · 2 评论 -
go env
命令go env用于打印Go语言的环境信息。其中的一些信息我们在之前已经多次提及,但是却没有进行详细的说明。在本小节,我们会对这些信息进行深入介绍。我们先来看一看go env命令情况下都会打印出哪些Go语言通用环境信息。go env命令可打印出的Go语言通用环境信息> runtime 包 包含与 Go 的运行时系统交互的操作,例如控制 goroutines 的函数。 > 也包含 reflect 包使用的低级别的类型信息;查看 reflect 的文档了解运行时类型的可编程接口。原创 2021-01-22 21:39:31 · 2279 阅读 · 1 评论 -
协程-泄露
什么是goroutine leakgoroutine leak,是go协程泄漏,什么是go协程泄漏,通俗来说,开启了一个goroutine,用完后,我们要正确让其结束。如果它没用了,还没结束,那就是goroutine leak。泄漏的goroutine占用一部分cpu,还可能占着一些其他资源,从而影响主协程效率,有时甚至产生异常。我们看下面的一个例子。例子中我们的主协程需要通过某远程服务查询到一个结果。使用一个multiQuery的函数启动多个协程,分别向不同的服务器发起查询,只要收到一个服原创 2021-01-22 21:38:59 · 911 阅读 · 1 评论 -
go run的错误
我们写一个关于系统信号量的程序并用 go run 调试。测试代码如下package mainimport ( "os" "os/signal" "fmt" "syscall")func main() { sig := make(chan os.Signal) signal.Notify(sig, syscall.SIGUSR2) for { select { case s := <-sig:原创 2021-01-22 21:38:10 · 1242 阅读 · 0 评论 -
golang中的数字签名
数字签名数字签名的方法签名的生成和验证签名 有原始数据对其进行哈希运算 -> 散列值 使用非对称加密的私钥对散列值加密 -> 签名 将原始数据和签名一并发送给对方 验证 接收数据 原始数据 数字签名 数字签名, 需要使用公钥解密, 得到散列值 对原始数据进行哈希运算得到新的散列值 非对称加密和数字签名总结:数据通信 公钥加密, 私钥解密 数字签名:- 私钥加密, 公钥解密使用RSA进行数字签名原创 2021-01-22 21:37:29 · 742 阅读 · 0 评论 -
golang中的消息认证
消息认证码go消息认证码的使用有一个包: crypto/hmac> func New(h func() hash.Hash, key []byte) hash.Hash> - 返回值: hash接口> - 参数1: 函数函数的函数名> sha1.new> md5.new> sha256.new> - 参数2: 秘钥> > 第二步: 添加数据> type Hash interface {>原创 2021-01-22 21:36:49 · 334 阅读 · 1 评论 -
golang单向散列函数
概念称谓: 单向散列函数, 哈希函数, 杂凑函数, 消息摘要函数接收的输入: 原像输出: 散列值, 哈希值, 指纹, 摘要单向散列函数特性 将任意长度的数据转换成固定长度的数据 很强的抗碰撞性 不可逆 MD4/MD5 不安全 散列值长度: 128bit == 16byte sha1 不安全 散列值长度: 160bit == 20byte sha2 - 安全 sha224 散列值长度: 224bit == 28by原创 2021-01-22 21:35:57 · 375 阅读 · 1 评论 -
golang非对称加密
密钥生成流程 生成私钥操作流程概述 使用rsa中的GenerateKey方法生成私钥 func GenerateKey(random io.Reader, bits int) (priv *PrivateKey, err error) rand.Reader -> import "crypto/rand" 1024 的整数倍 - 建议 通过x509标准将得到的ras私钥序列化为ASN.1 的 DER编码字符串 func MarshalPKCS原创 2021-01-22 21:34:52 · 984 阅读 · 1 评论 -
golang中的对称加密
概念 按位异或 第一步需要将数据转换为二进制 按位异或操作符: ^ 两个标志位进行按位异或操作: 相同为0, 不同为1 举例: 1 0 0 0 ----> 81 0 1 1 ----> 11-----------------------按位异或一次0 0 1 1 ----> 31 0 1 1 ----> 11-----------------------按位异或两侧1 0 0原创 2021-01-22 21:34:16 · 1110 阅读 · 2 评论 -
golang中的aliyunoss
安装go get -u github.com/aliyun/aliyun-oss-go-sdk/ossoss相关术语权限https://help.aliyun.com/document_detail/100676.html?spm=a2c4g.11186623.6.639.c8974c7dsCQHx3文件上传import ( "fmt" "github.com/aliyun/aliyun-oss-go-sdk/oss")const ( //OSSBu原创 2021-01-22 21:33:25 · 737 阅读 · 0 评论 -
golang中的redigo
安装go get -u github.com/gomodule/redigo/redis连接var ( redisHost = "127.0.0.1:6379" redisPass = "root")//创建redis连接池func newRedisPool() *redis.Pool { return &redis.Pool{ MaxIdle: 50, MaxActive: 30, IdleTimeout: 300 *原创 2021-01-22 21:32:38 · 449 阅读 · 1 评论 -
golang中的sjson
安装go get -u github.com/tidwall/sjson设置值import "github.com/tidwall/sjson"const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}`func main() { //把name.last的值给改变了 value, _ := sjson.Set(json, "name.last", "Anderson") println(原创 2021-01-22 21:31:54 · 1193 阅读 · 2 评论 -
golang中的collection
appendAppend挂载一个元素到当前Collection,如果挂载的元素类型不一致,则会在Collection中产生ErrorsSlice := []int{1, 2} //没变intColl := NewIntCollection(sSlice)intColl.Append(3)if intColl.Err() == nil { intColl.DD()}IsEmptyIsEmpty() bool判断一个Collection是否为空,为空返回true, 否则原创 2021-01-22 21:31:20 · 1418 阅读 · 0 评论 -
golang中的goredis
连接func RedisConPoint(db int) *redis.Client { addr := beego.AppConfig.String("redis_host") password := beego.AppConfig.String("redis_password") client := redis.NewClient(&redis.Options{ Addr: addr, Password: password原创 2021-01-22 21:30:29 · 755 阅读 · 1 评论 -
golang中的gjson
gjson包安装使用go get -u github.com/tidwall/gjsonconst json = `{"name":[{"first":"Janet","last":"Prichard"}, {"abc": 1, "e" : 2}],"age":47}`func main() { v := gjson.Get(json, "name") if v.String() == "" { fmt.Println("nil") } else {原创 2021-01-22 21:29:48 · 3234 阅读 · 0 评论 -
golang中的web服务平滑重启
新进来的请求怎么办?fork一个子进程,继承父进程的监听socket 子进程启动成功之后,接收新的连接 父进程停止接收新的连接,等已有的请求处理完毕,退出 优雅重启成功平滑升级子进程如何继承父进程的文件句柄?通过os.Cmd对象中的ExtraFiles参数进行传递子进程如何继承父进程的文件句柄通过os.Cmd对象中的ExtraFiles参数进行传递 文件句柄继承实例分析web服务器平滑升级使用go1.8版本的shutdown方法进行优雅关闭 使用socket继承实现,子进原创 2021-01-22 21:29:04 · 427 阅读 · 1 评论 -
golang中的优雅中止
简介按照一般的设计原则, 每个 HTTP 请求都是无状态的,因此大多情况下 Web 应用都很容易做水平扩展。“无状态”也意味着 HTTP 请求发起重试的成本是很低的,从而使得 Web 接口的开发很少关注优雅中止(一部分也因为 Web 框架做了这部分的考虑)。不过,业务中 ① 总会存在对中止比较敏感的接口(比如支付相关),并且 ② 总会存在一些带状态的服务,此时优雅中止就显得比较重要了。本文通过一个Go 定时任务示例来简单介绍 Go 技术栈中优雅中止的处理思路。k8s中pod的终止机制作为原创 2021-01-22 21:28:27 · 1004 阅读 · 0 评论 -
golang中的httptest
实例import ( "fmt" "net/http" "strings")func myHandler(w http.ResponseWriter, r *http.Request) { //解析参数,默认是不会解析的 r.ParseForm() fmt.Fprintf(w, "%v\n", r.Form) fmt.Fprintf(w, "path:%s\n", r.URL.Path) fmt.Fprintf(w, "schema:%s\n",原创 2021-01-22 21:27:52 · 1258 阅读 · 2 评论 -
2021-01-22
简介在Go中http包的Server中,每一个请求在都有一个对应的goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务,比如数据库和RPC服务。用来处理一个请求的goroutine通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息,验证相关的令牌,请求的截止时间。然后系统才能释放这些goroutine占用的资源。在Google内部,开发了Context包,专门用来简化对于处理单个请求的多个goroutine之间与请求域的数据,取消信号,截止时间等相关操作原创 2021-01-22 21:27:18 · 600 阅读 · 0 评论 -
golang平滑重启
问题程序升级过程中,如何不影响正在处理的请求? 正在处理的请求怎么办? 新进来的请求怎么办?正在处理的请求等待处理完成后退出 go1.8就支持了新来的请求怎么办?Fork一个子进程,继承父进程的监听socket 子进程启动成功后,接收新的连接 父进程停止接收新的连接,等已有的请求处理完毕,退出 优雅重启成功子进程如何继承父进程的文件句柄?(linux下)通过os.Cmd对象中的ExtraFiles参数进行传递 文件句柄继承实例分析...原创 2021-01-22 21:26:42 · 349 阅读 · 1 评论 -
QPS相关知识
QPS:请求进入的速度(每秒进入多少个请求)耗时:请求停留的时间并发数:系统中同时存在的请求数并发数=QPS*耗时QPS耗时并发数---------------5000人/年4年20000人原创 2021-01-21 21:16:33 · 359 阅读 · 1 评论 -
golang中的爬虫
简单爬虫//爬取网页内容func httpGet(url string) (result string, err error) { resp, err1 := http.Get(url) if err1 != nil { err = err1 return } defer resp.Body.Close() //读取网页的内容 buf := make([]byte, 1024*4) for { n, err := re原创 2021-01-21 21:11:16 · 580 阅读 · 2 评论 -
golang中的http客户端
http WEB客户端: 1. 获取web服务器数据: func Get(url string) (resp *Response, err error) 返回:http应答包,保存成 struct type Response struct { Status string // e.g. "200 OK" StatusCode int // e.g. 200 Proto string // e.g. "HTTP/1.0"原创 2021-01-20 21:53:58 · 502 阅读 · 1 评论 -
golang中的http服务器
简介http WEB服务器: 1. 注册回调函数:http.HandleFunc("/", myHandler) func myHandler(w http.ResponseWriter, r *http.Request) w:给客户端回发数据 r:从客户端读到的数据 type ResponseWriter interface { Header() Header Write([]byte) (int, error) Writ原创 2021-01-20 21:53:26 · 1810 阅读 · 1 评论