• Golang 请求限速、排队实现

    概要 在调用第三方 API 的时候, 基本都有访问限速的限制条件. 第三方的 API 有多个的时候, 就不太好控制访问速度, 常常会导致 HTTP 429(Too Many Requests) 然后就会有一段时间的禁止访问. 为了应对这种限速的情况, 通过一个简单的请求队列来控制访问的速度, 之后基本没遇到过 HTTP 429 了. 实现思路 首先, 每个请求包装成一个 RequestParam 的 struct, 其中包含请求的地址,类型,参数以及 response 的 channel. 发送...

    go开发, 技术干货 2022年4月29日
  • Golang 并发原理分析

    Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言;也正是Go语言的并发特性,吸引了全球无数的开发者。 并发(concurrency)和并行(parallellism) 并发(concurrency):两个或两个以上的任务在一段时间内被执行。我们不必care这些任务在某一个时间点是否是同时执行,可能同时执行,也可能不是,我们只关心在一段时间内,哪怕是很短的时间(一秒或者两秒)是否执行解决了两个或两个以上任务。 并行(parallellism):两个或两个以上的任务在同一时刻...

    go开发, 技术干货 2022年4月22日
  • 使用 Go 语言实现汉诺塔(Hanota)算法

    我最近重温了一下《猩球崛起》这部电影。在电影中,凯撒就玩了河内塔游戏。你还有印象吗?其实独自一人玩一些游戏是好难的😭(译者不知作者为何这么说🤔,难道是无聊嘛?🤓),今天我们就用 Golang 来实现一下汉诺塔游戏。 游戏起源 相传最早发明这个问题的人是法国数学家爱德华·卢卡斯(Edouard Lucas)。 在世界中心的贝拿勒斯(印度北部)圣殿中,有三根宝石针插入了一个黄铜盘中。在印度教主神梵天(Brahma)创世时,将其中一根针上从下到上装配了 64 个金片,这也就是所谓的汉诺塔。 无论白天黑...

    go开发, 技术干货 2022年4月19日
  • Go语言 如何配制 高性能sql.DB 的

    有很多教程是关于Go的sql.DB类型和如何使用它来执行SQL数据库查询的。但大多数内容都没有讲述SetMaxOpenConns(), SetMaxIdleConns() 和 SetConnMaxLifetime()方法, 您可以使用它们来配置sql.DB的行为并改变其性能。 在本文我将详细解释这些设置的作用,并说明它们所能产生的(积极和消极)影响。 开放和空闲连接 一个sql.DB对象就是一个数据库连接池,它包含“正在用”和“空闲的”连接。一个正在用的连接指的是,你正用它来执行数据库任务,例如...

    go开发, 技术干货 2022年3月1日
  • 如何确定一个 Go 变量会被分配在哪里?

    本文作者记录了 Go 变量分配位置的观测技巧和 Go 语言设计思路。 一、由 iter 包引发的疑问 最近在 GitHub 上偶然发现了 Brad Fitzpatrick 的 iter 包,整个包只有 一个函数(一行代码): 但其中的一行注释令人费解: It does not cause any allocations. 1. 空结构体 我们知道,struct{} 是空结构体(empty struct)。关于空结构体,Dave Cheney 在 The empty struct 中作了很好地阐述...

    go开发, 技术干货 2021年12月2日
  • 深入理解Golang Channel 结构

    Go 语言的 channel 底层是什么数据结构?本文深入解析了 channel。 Golang 使用 Groutine 和 channels 实现了 CSP(Communicating Sequential Processes) 模型,channles 在 goroutine 的通信和同步中承担着重要的角色。 在 GopherCon 2017 中,Golang 专家 Kavya 深入介绍了 Go Channels 的内部机制,以及运行时调度器和内存管理系统是如何支持 Channel 的,本文根...

    go开发, 技术干货 2021年11月18日
  • 七步制作精简镜像

    目录 介绍 镜像层(Layers) 制作步骤 lab-1:初始化构建 Redis 镜像 lab-2:优化基础镜像 lab-3:串联 Dockerfile 指令 lab-4:压缩你的镜像 lab-5:使用最精简的 base image lab-6:提取动态链接的 .so 文件 lab-7:为 Go 应用构建精简镜像 总结 参考 介绍 前段时间网易蜂巢曾经推出蜂巢 Logo T恤,用的正是 Docker 镜像制作,最神奇的是,它最终的镜像大小只有 585 字节。 有些镜像都不是我们自己来打包的(比如...

    go开发 2021年11月16日
  • 浅谈 Golang 锁的应用: sync包

    Go 语言 sync 包中的锁都在什么场景下用?怎么用?本文对 sync 包内的锁做了梳理。 今天谈一下锁,以及 Go 里面 Sync 包里面自带的各种锁,说到锁这个概念,在日常生活中,锁是为了保护一些东西,比如门锁、密码箱锁,可以理解对资源的保护。在编程里面,锁也是为了保护资源,比如说对文件加锁,同一时间只也许一个用户修改,这种锁一般叫作文件锁。 实际开发中,锁又可分为互斥锁(排它锁)、读写锁、共享锁、自旋锁,甚至还有悲观锁、乐观锁这种说法。在 Mysql 数据库里面锁的应用更多,比如行锁、表...

    go开发, 技术干货 2021年10月25日
  • Golang 闭包的实现

    什么是闭包?什么场景下会用闭包?本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。 Go中的闭包 闭包是函数式语言中的概念,没有研究过函数式语言的用户可能很难理解闭包的强大,相关的概念超出了本书的范围。Go语言是支持闭包的,这里只是简单地讲一下在Go语言中闭包是如何实现的。 函数f返回了一个函数,返回的这个函数,返回的这个函数就是一个闭包。这个函数中本身是没有定义变量i的,而是引用了它所在的环境(函数f)中的变量i。 c1跟c2引用...

    go开发, 技术干货 2021年10月18日
  • Go 可变参数 ... parameters 读这篇就够了

    Go 语言可变参数怎么用能最大化它的效用?本文对可变参数进行了详细介绍。 在实际开发中,总有一些函数的参数个数是在编码过程中无法确定的,比如我们最常用的 fmt.Printf 和 fmt.Println: 当你需要实现类似的接口时,就需要我们的可变参数出场了。 golang 的可变参数 可变参数就是一个占位符,你可以将 1 个或者多个参数赋值给这个占位符,这样不管实际参数的数量是多少,都能交给可变参数来处理,我们看一下可变参数的声明: 可变参数使用 name ...Type 的形式声明在函数的参...

    go开发, 技术干货 2021年9月18日
历经多年发展,已成为国内好评如潮的Linux云计算运维、SRE、Devops、网络安全、容器云、Go、Python开发专业人才培训机构!