golang 写个堆排序

堆排序是我觉得排序里面数据结构运用最灵活的一个算法,首先如何用一个数组表示一个堆,如何取到节点的父节点和左右子节点。 10.png 左侧是一个堆,右侧是一个数组的索引,可见我们只要从上到下,从左到右填充数字,并且保证,所有父节点大于两个子节点就可以构成一个堆。 对于一个堆,我们可以通过父节点和子节点之间的索引总结出如下关系: // func heap(i int) { // parent := (i - 1) / 2 // 父节点 // c1 := 2*i + 1 // 左子节点 // c2 :...阅读全文

简书 2021-01-26 03:32:44 追风骚年

golang-匿名函数

概念 所谓匿名函数,就是没有名字的函数。 匿名函数的两种使用方式 一、在定义匿名函数的时候就可以直接使用(这种方式只使用一次) package main import ( "fmt" ) func main(){ res1 := func (n1 int, n2 int) int { return n1 + n2 }(10, 30) //括号里的10,30 就相当于参数列表,分别对应n1和n2 fmt.Println("res1=",res1) } D:\goproject\src\main>g...阅读全文

简书 2021-01-26 03:32:43 stepinstep

PHP概况

近日需要了解PHP,顺手整理了一下相关信息。 Gitee发布2020开源年报:Java稳居语言占比第一 PHP排名第三 Gitee2020开源年报语言排名 W3Techs 是一个专门调查 Web 技术的网站,提供有关 Web 各种技术的使用情况信息。 2019排名 2020排名 image.png 使用 PHP 的热门网站 Facebook.com Wikipedia.org Vk.com 360.cn Sina.com.cn WordPress.com Pinterest.com Babytr...阅读全文

简书 2021-01-26 03:32:43 初心2019

boltdb源码阅读

前言最近抽时间看了boltdb的源码,代码量不大(大概4000行左右),而且支持事务,结构也很清晰,由于比较稳定,已经归档,确实是学习数据库的最佳选择。而且不少出名的开源项目在使用它,比如etcd,InfluxDB等。本文记录下笔者在阅读源码后了解到的其工作原理,以留备忘。简介boltdb数据库是一款go开发的k/v数据库。其设计源于LMDB(Lightning Memory-Mapped Database),持久化到单文件中,通过mmap将文件映射到内存,这样读文件可以减少一次IO,但是写文件...阅读全文

Segmentfault 2021-01-31 18:32:33 .container .car 等

Go - httpclient 常用操作

模块介绍httpclient 是基于 net/http 封装的 Go HTTP 客户端请求包,支持常用的请求方式、常用设置,比如:支持设置 Mock 信息支持设置失败时告警支持设置失败时重试支持设置项目内部的 Trace支持设置超时时间、Header 等请求说明方法名描述httpclient.Get()GET 请求httpclient.PostForm()POST 请求,form 形式httpclient.PostJSON()POST 请求,json 形式httpclient.PutForm()...阅读全文

Segmentfault 2021-01-31 21:32:33 .container .car 等

模块一 Go语言基础知识-工作区和GOPATH

我们学习 Go 语言时,要做的第一件事,都是根据自己电脑的计算架构(比如,是 32 位的计算机还是 64 位的计算机)以及操作系统(比如,是 Windows 还是 Linux),从Go 语言官网下载对应的二进制包,也就是可以拿来即用的安装包。随后,我们会解压缩安装包、放置到某个目录、配置环境变量,并通过在命令行中输入go version来验证是否安装成功。在这个过程中,我们还需要配置 3 个环境变量,也就是 GOROOT、GOPATH 和 GOBIN。这里我可以简单介绍一下。GOROOT:Go ...阅读全文

51CTO博客 2021-01-25 13:12:58 mb600beaa63f802

基于 MySQL 分布式锁,防止多副本应用初始化数据重复

现在有一个需求,应用启动时需要初始化一些数据,为了保证高可用,会启动多副本(replicas >= 3),如何保证数据不会重复?方案一:数据带上主键最简单的方法,初始化数据都带上主键,这样主键冲突就会报错。但是这么做我们需要对冲突的错误进行额外处理,因为插入我们一般会复用已写好的 DAO 层代码。另外,初始化数据的主键可能是动态生成的,并不想把主键写死。所以下面来介绍此次的主角:基于 MySQL 的分布式锁的解决方案。方案二:基于 MySQL 的分布式锁多副本分布式应用,在这种 n 选 1 竞争...阅读全文

Segmentfault 2021-01-30 22:32:32 .container .car 等

企业项目迁移go-zero全攻略(二)

承接上篇:上篇文章讲到 go-zero 架构设计和项目设计。本篇文章接着这个项目设计,将生成的 app 模块 中 gateway 和 RPC 进行改造。废话不多说,让我们开始!gateway servicegateway 中我做了一些自定义,在端请求我们后台接口情况下,虽然多数情况是不需要关心错误码的,但是避免不了要某些场景还是需要根据固定错误码去做特殊处理,我自己定义了一个错误类,这个错误类只在 gateway 中使用:err.go:package xerr import "fmt" type...阅读全文

Segmentfault 2021-01-29 22:32:33 .container .car 等

golang 四则运算 计算器 yacc 归约

golang 四则运算 计算器 yacc 归约 缘起 最近阅读<<自制编程语言>>一书 开头一章便是教读者使用lex/yacc工具 制作四则运算器 其中yacc的移进/归约的思想很有启发 于是使用golang练习之 目标 制作一个四则运算器, 从os.Stdin读入一行表达式, 然后输出计算过程和结果 支持+ - * / 支持左右括号 支持负数 难点 记号扫描(lexer) 逐字符扫描记号 单字符记号可直接识别, + - * / ( ) 多字符记号, 此处只有浮点数, 通过有限状态的转换进行识别...阅读全文

使用 Goroutine 和 Chanel 快速实现并发和排队

问题:某线下营业厅有 10 个业务办理窗口,每个窗口同一时刻只能接待一位客人。用 Goroutine 模拟同时有 12 个客户需要办理业务的过程。 思路是这样的:一个 Goroutine 负责将这些任务(也就是例子中的客户)分发到 jobChannel 中,另一个 Goroutine 读取 jobChannel,读到任务后检查是否还有执行器(抽象出来的概念,也就是例子中的业务办理窗口)可以执行该任务,有就创建 Goroutine 进行执行,否则等待,当有可用执行器时继续。这里“检查是否还有可用执...阅读全文

Segmentfault 2021-01-29 13:32:34 .container .car 等

线程模型以及goroutine协程的实现方式

一、线程模型1.1 内核级线程模型 每个线程由内核调度器独立的调度,所以如果一个线程阻塞则不影响其他的线程。 优点:在多核处理器的硬件的支持下,内核空间线程模型支持了真正的并行,当一个线程被阻塞后,允许另一个线程继续执行,所以并发能力较强。 缺点:每创建一个用户级线程都需要创建一个内核级线程与其对应,这样创建线程的开销比较大,会影响到应用程序的性能。 1.2 用户级线程模型 优点: 这种模型的好处是线程上下文切换都发生在用户空间,避免的模态切换(mode switch),从而对于性能有积极的影响...阅读全文

简书 2021-01-25 06:32:49 陈光岚_强化班

go语言中的UTF-8与GBK编码转换

场景: 在做网页爬虫类项目时候,经常会遇到GBK/GB2312等中文编码。此时就需要进行编码转换工作。 使用 Go 官方的 golang.org/x/text 包实现,你也可以直接查看代码: https://github.com/golang/text/tree/master/encoding/simplifiedchinese 我们直接下载使用即可 go get golang.org/x/text 代码如下: /* Golang 中的 UTF-8 与 GBK 编码转换 */ package m...阅读全文

简书 2021-01-25 06:32:47 零一间

go语言队列的链式表示和实现

1、链队的定义 队列(Queue)是一种先进先出的线性表,在表一段插入(表尾),在另一端(表头)删除。 队头(Front),即表尾端 队尾(Rear),即表头端 FIFO(First In First Out),即队列的操作具有先进先出的特性。 与栈相同,队列也是限定插入和删除只能在表的"端点"进行的线性表,故栈和队列是线性表的子集(是插入和删除位置受限的线性表)。 链队列的操作与链表、链栈类似,当用户无法估计所用队列的长度,宜采用链队列。本文只给出以下操作的go语言实现。 初始化 入队 出队 ...阅读全文

Golang "github.com/pkg/errors" 包使用的正确姿势

Golang 的 error 不会像 Java 那样打印 stackTrack 信息。回溯 err 非常不方便。之前见过比较蠢的的做法是层层 log,写起来贼费劲。大家应该都知道可以通过 github.com/pkg/errors 这个包来处理 err,WithStack(err) 函数可以打印 stack。注意,使用 log.Errorf("%+v", err) 才会打印 stackTrack,使用 %v %s 不行。但是如果多次使用 WithStack(err),会将 stack 打印多遍,...阅读全文

Segmentfault 2021-01-28 08:32:32 .container .car 等