【博客大赛】浅析go切片与排序

切片是Go语言中引入的用于在大多数场合替代数组的语法元素。切片是一种长度可变的同类型元素序列,它原则上不支持存储不同类型的元素,当然了作为打工人是非常清楚“原则上”的潜台词就是“某种情况下允许” special := []interface{}{“hello go”, 2021, 4.15} 这种允许的情况有机会我们另外讨论,这个不是本次的讨论范围,本文就事论事,还不至于深入到原理。 正所谓有序列的地方就有排序的需求。在各种排序算法都已经成熟的今天,我们完全可以针对特定元素类型的切片手写排序函数...阅读全文

51CTO博客 2021-04-18 22:59:45 yerikyu

[Go]解决go-smtp发送内容乱码和发送html邮件不解析

使用github.com/emersion/go-smtp , 通过smtp发送通知邮件内容加上html代码的内容后 , 在一些邮箱里会被原样展示 , 并没有展示成html , 原因是没有加Content-Type , 加上之后就可以了tools/smtp.gopackage tools import ("encoding/base64""github.com/emersion/go-sasl""github.com/emersion/go-smtp""strings") func SendSm...阅读全文

51CTO博客 2021-04-18 21:18:30 mb6066e247821a1

服务端 IO 性能大比拼:Node、PHP、Java、Go哪家强?

理解应用程序的输入/输出(I/O)模型,意味着其在计划处理负载与残酷的实际使用场景之间的差异。若应用程序比较小,也没有服务于很高的负载,也许它影响甚微。但随着应用程序的负载逐渐上涨,采用错误的I/O模型有可能会让你到处踩坑,伤痕累累。正如大部分存在多种解决途径的场景一样,重点不在于哪一种途径更好,而是在于理解如何进行权衡。让我们来参观下I/O的景观,看下可以从中窃取点什么。在这篇文章,我们将会结合Apache分别比较Node,Java,Go,和PHP,讨论这些不同的语言如何对他们的I/O进行建模...阅读全文

51CTO博客 2021-04-18 20:04:45 mb6066e247821a1

Go语言开发笔记

GO开发Golang被誉为21世纪的C语言2012.3 - 2020.2 1.0 - 1.14版本为什么选择GO继承python的简洁 & C语言的性能于一身环境搭建执行golang代码。go run **.go或者go文件中 go build 会生成一个文件 在执行可执行文件再或者 go install。会将可执行文件放到bin目录创建目录目录结构如下: xxx - bin - pkg - src //用于存放项目代码的目录环境变量GOROOT, GO编译器安装目录 GOPATH, 用于存放项...阅读全文

51CTO博客 2021-04-18 18:56:10 mb6066e165689bf

Go语言从入门到实战,带你拿下Golang的高效编程法

独特的学习方法:着重对比 Go 语言语法和其他其他编程语言的不同,带你快速入门 Go 语言,高效掌握 Go 语言的编程方法。学以致用,注重实战:带你对 Go 语言在开发中的常见问题进行拆解分析,比如并发编程模式,常见并发任务,高可用服务设计,性能调优等难题,让你可以从入门走向实战。适合已经掌握如 C、C++、Java、Python、PHP 等一门或多门编程语言的学员。 蔡超目前在 Mobvista 担任技术副总裁兼首席架构师,曾在亚马逊中国、惠普等担任首席软件架构师。学后获得:快速掌握 Go 语...阅读全文

51CTO博客 2021-04-18 18:55:44 mb6066e165689bf

安装Sublime Text 支持Go插件

1、安装GO进入GO的国内网站,下载安装https://golang.google.cn/2、环境变更配置重要的是GOROOT 和 GOPATH, 一般安装在C:\GO目录下, 会自动配置GOROOT目录 , 以及在PATH上加入C:\GO\bin3、在命令中进行测试go env 查看环境变更其中GOPATH会在 go install中用到,GO语言会 GOPATH目录下建立bin、pkg目录 ,来存在编译好的二进制文件及包文件 4、安装sublimeText3此工具以快捷、可扩展出名, 在官网...阅读全文

51CTO博客 2021-04-18 18:10:57 wangxinyu2011

Go语言proto使用入门

Go语言proto使用入门 环境安装 protoc安装 protoc是用于编译proto文件的工具 scoop安装 scoop bucket add extras //添加额外的仓库 scoop install protobuf //安装Protobuf 手动安装 可以从ProtoBuf仓库中下载相关文件安装 Golang支持安装 protoc可以将proto模板编译成多种语言,但是默认不支持go,需要额外安装插件 go get -u github.com/golang/protobuf/pro...阅读全文

简书 2021-04-18 17:32:46 突击手平头哥

Java 微服务能像 Go 一样快吗?

1. 背景介绍我们希望通过实验了解 Java 微服务在运行速度上能否达到 Go 微服务的水平。目前,软件行业普遍认为 Java 已经过于陈旧、缓慢且无聊。而 Go 则成了快速、崭新以及酷炫的代名词。真是这样吗?我们想从数据的角度看看这样的印象是否站得住脚。我们希望建立一个公平的测试,因此创建了一项非常简单的微服务,其中不含外部依赖项(例如数据库),而且代码路径非常短(仅处理字符串)。我们在其中包含有指标及日志记录,因为似乎一切微服务都或多或少包含这些内容。另外,我们使用了小型、轻量化的框架(He...阅读全文

51CTO博客 2021-04-18 13:06:16 mb6066e504cce6f

随机数

[toc] 我们应用中的随机数 抽奖,大转盘 我们经常接触的验证码 密码找回 go中select的公平保证 再然后https通信中的秘钥生成 还有游戏中爆装备的概率等 你以为的随机是真的随机吗 如果我们试着在程序开始的生成一个随机数,你会发现每次都是一样的。 我们可以准确的判断出随机数是什么。 所以这也就是我们经常说的伪随机数。 那有没有真正的随机数呢,比如我们可以再一开始生成一个seed,然后再去生成随机数,这样每次都不一样了,但是这样就是真正的随机了吗。举一个极端的例子,你用随机数生成密码,...阅读全文

简书 2021-04-18 09:32:35 lucasgao

go语言 defer详解

每个goroutine都维护一个自己的defer链表。 新注册的defer会被添加到链表头。 defer链表执行时,从链表头开始执行。所以表现出倒叙执行。 函数如果注册了defer函数,编译器会在代码底部插入deferreturn函数。 函数执行到deferreturn时,会根据defer结构体中的字段判断当前链表头的defer是不是自己注册的,是则执行并删除,反之,代表当前函数注册的defer已经执行完了,函数结束。 go1.12之前(含)使用上述方法执行defer,有一下几个问题: _def...阅读全文

简书 2021-04-18 05:32:35 __robin

对golang sync.once 实现的思考

源代码分析 sync.Once的源码很精简,但是有一行原子操作的代码却让我产生了疑惑。 在提出疑惑前,我们先分析下其实现的源代码。 我先添加一些基本的注释 // 去掉了源代码里面的注释 // Once is an object that will perform exactly one action. type Once struct { done uint32 m Mutex } func (o *Once) Do(f func()) { // fast path, // o.done=0代表...阅读全文

简书 2021-04-18 05:32:35 zhubaba

2021-04-17 golang环境安装

1.在网站下载GO:https://studygolang.com/dl tempsnip.png 2.选择想存放的位置,一路点击安装: cmd查看安装情况: image.png 3.配置环境变量: 删除用户变量里的:GOPATH=C:\Users\51237\go 配置系统变量:这就是以后存放代码和第三方包的地方。 添加GOPATH:D:\program\go image.png 且在path中添加gopath的bin目录(没有就新建一个):D:\program\go\bin image.pn...阅读全文

简书 2021-04-18 05:32:35 shiqianqian

手撸golang 仿spring ioc/aop 之9 扫码4

手撸golang 仿spring ioc/aop 之9 扫码4 缘起 最近阅读 [Spring Boot技术内幕: 架构设计与实现原理] (朱智胜 , 2020.6) 本系列笔记拟采用golang练习之 Talk is cheap, show me the code. Spring Spring的主要特性: 1. 控制反转(Inversion of Control, IoC) 2. 面向容器 3. 面向切面(AspectOriented Programming, AOP) 源码gitee地址: ...阅读全文

简书 2021-04-18 05:32:31 老罗话编程

go-zero 如何扛住流量冲击(二)

本篇文章承接上一篇go-zero 如何扛住流量冲击(一)。 上一篇介绍的是 go-zero 中滑动窗口限流,本篇介绍另外一个 tokenlimit ,令牌桶限流。 使用 const ( burst = 100 rate = 100 seconds = 5 ) store := redis.NewRedis("localhost:6379", "node", "") fmt.Println(store.Ping()) // New tokenLimiter limiter := limit.New...阅读全文

51CTO博客 2021-04-17 23:30:54 mob604756f0bbf4

Go-Zero 如何扛住流量冲击(一)

不管是在单体服务中还是在微服务中,开发者为前端提供的 API 接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性。即接口也需要安装上保险丝,以防止非预期的请求对系统压力过大而引起的系统瘫痪。 go-zero 集成了开箱即用的 限流器 。其中内置了两种限流器,也对应两类使用场景: 本文就来介绍一下 periodlimit 。 使用 const ( seconds = 1 total = 100 quota = 5 ) // New li...阅读全文

51CTO博客 2021-04-17 23:28:54 mob604756f0bbf4

Go-Zero 是如何追踪你的请求链路?

“ go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。” 序言微服务架构中,调用链可能很漫长,从 http 到 rpc ,又从 rpc 到 http 。而开发者想了解每个环节的调用情况及性能,最佳方案就是 全链路跟踪。 追踪的方法就是在一个请求开始时生成一个自己的 spanID ,随着整个请求链路传下去。我们则通过这个 spanID 查看整个链路的情况和性能问题。 下面来看看 go-zero 的链路实现。 代码结构...阅读全文

51CTO博客 2021-04-17 23:26:40 mob604756f0bbf4

Go-Zero如何应对海量定时/延迟任务

一个系统中存在着大量的调度任务,同时调度任务存在时间的滞后性,而大量的调度任务如果每一个都使用自己的调度器来管理任务的生命周期的话,浪费 cpu 的资源而且很低效。 本文来介绍 go-zero 中 延迟操作,它可能让开发者调度多个任务时,只需关注具体的业务执行函数和执行时间「立即或者延迟」。而 延迟操作,通常可以采用两个方案: Timer:定时器维护一个优先队列,到时间点执行,然后把需要执行的 task 存储在 map 中 collection 中的 timingWheel ,维护一个存放任务组...阅读全文

51CTO博客 2021-04-17 22:50:25 mob604756f0bbf4