目录进程内加锁trylock基于redis的setnx基于zk基于etcdredlock如何选择在单机程序并发或并行修改全局变量时,需要对修改行为加锁以创造临界区。为什么需要加锁呢?可以看看下段代码:package main import ( "sync" ) // 全局变量 var counter int func main() { ......
388
0
0
2023-03-19
目录前言基础知识看个问题什么是内存对齐为什么需要内存对齐unsafe.AlignOf()内存对齐规则举个例子空结构体的对齐规则总结前言前面有篇文章我们学习了 Go 语言空结构体详解,最近又在看 unsafe包的知识,在查阅相关资料时不免会看到内存对齐相关的内容,虽然感觉这类知识比较底层,但是看到了却不深究和渣男有什么区别?虽然我不会,但我可以学,那 ......
352
0
0
2023-03-17
目录开篇container/heap核心函数InitPop/PushRemoveFix如何接入IntHeap优先队列按时间戳排序总结开篇在 Golang 的标准库 container 中,包含了几种常见的数据结构的实现,其实是非常好的学习材料,我们可以从中回顾一下经典的数据结构,看看 Golang 的官方团队是如何思考的。container/list 双向链 ......
336
0
0
2023-03-16
目录前言需求一需求二Context 接口emptyCtxvalueCtx类型定义WithValuecancelCtx类型定义cancelCtxWithCanceltimerCtx类型定义WithDeadlineWithTimeout总结前言日常 Go 开发中,Context 包是用的最多的一个了,几乎所有函数的第一个参数都是 ctx,那么我们为什么要传递 C ......
334
0
0
2023-03-16
目录引子思路实战交互界面定时任务任务执行代码效果总结引子任务调度(Task Scheduling)是很多软件系统中的重要组成部分,字面上的意思是按照一定要求分配运行一些通常时间较长的脚本或程序。在爬虫管理平台 Crawlab 中,任务调度是其中的核心模块,相信不少朋友会好奇如何编写一个任务调度系统。本篇文章会教读者用 Go 语言编写一个非常简单的任务调度系统 ......
420
0
0
2023-03-13
目录前言一、概述二、接口类型2.1 接口的定义2.2 实现接口的条件2.3 为什么需要接口2.4 接口类型变量三、值接收者和指针接收者3.1 值接收者实现接口3.2 指针接收者实现接口四、类型与接口的关系4.1 一个类型实现多个接口4.2 多种类型实现同一接口五、接口嵌套六、空接口七、类型断言总结前言go语言并没有面向对象的相关概念,go语言提到的接口和ja ......
396
0
0
2023-03-12
目录前言互斥锁TryLock和Unlock实现Lock实现实现看门狗机制看门狗实现红锁加锁实现看门狗实现解锁实现前言在项目中我们经常有需要使用分布式锁的场景,而Redis是实现分布式锁最常见的一种方式,这篇文章主要是使用Go+Redis实现互斥锁和红锁。下面的代码使用go-redis客户端和gofakeit库。代码地址互斥锁Redis里有一个设置如果不存在的 ......
331
0
0
2023-03-10
目录goroutine通道Range 和 CloseSelect官方留的两道练习题等价的二叉树网络爬虫源码地址goroutinegoroutine是由Go运行时管理的轻量级线程。go f(x, y, z)在一个新的goroutine中开始执行f(x, y,z)。goroutines运行在相同的地址空间中,所以对共享的内存访问必须同步。sync包提供了基本的同 ......
305
0
0
2023-03-09
目录前言可导出的标识符嵌入字段提升标签结构体与JSON相互转换结构体转JSONJSON转结构体练习代码步骤前言结构体是一个序列,包含一些被命名的元素,这些被命名的元素称为字段(field),每个字段有一个名字和一个类型。结构体用得比较多的地方是声明与数据库交互时需要用到的Model类型,以及与JSON数据进行相互转换。(当然,项目中任何需要多种数据结构组合在 ......
277
0
0
2023-03-08
目录业务场景什么是分布式读写锁分布式读写锁的访问原则读锁写锁具体实现通过 gorm 连接 mysql实现读锁模式实现写锁模式总结业务场景因为项目刚上线,目前暂不打算引入其他中间件,所以打算通过 mysql 来实现分布式读写锁;而该业务场景也满足分布式读写锁的场景,抽象后的业务场景是:特定资源 X,可以执行 2 种操作:读操作和写操作,2种操作需要满足下面条件 ......
461
0
0
2023-03-05
目录基本介绍反射中常见函数和概念reflect.TypeOf(变量名)reflect.ValueOf(变量名)变量.interface{}和reflect.Value是可以相互转换的基本使用反射注意事项反射的最佳实践基本介绍反射可以在运行时动态获取变量的各种信息,比如变量的类型,类别如果是结构体变量,还可以获取到结构体本身的信息通过反射,可以修改变量的值,可 ......
375
0
0
2023-03-03
目录1. 前言2. 依赖注入(DI)是什么3. Wire Come3.1 简介3.2 快速使用3.3 基础概念4. Wire使用实践4.1 基础使用4.2 高级特性4.3 高阶使用5. 注意事项5.1 相同类型问题5.2 单例问题6. 结语1. 前言接触 Golang 有一段时间了,发现 Golang 同样需要类似 Java 中 Spring 一样的依赖注入 ......
635
0
0
2023-03-03
目录Go 字符串实现原理字符串的截取字符串和切片的转换字符串和切片共享底层数组什么是万能指针字符串和其它数据结构的转化整数和字符串相互转换Parse 系列函数Format 系列函数小结Go 字符串实现原理Go 的字符串有个特性,不管长度是多少,大小都是固定的 16 字节。package main import (  &n ......
576
0
0
2023-02-28
目录引言基于HTML Element 元素的选择器ID 选择器Element ID 选择器Class选择器Element Class 选择器属性选择器parent>child选择器prev+next相邻选择器prev~next选择器内容过滤器:first-child过滤器:first-of-type过滤器:last-child 和 :last-of-t ......
353
0
0
2023-02-27
目录前言:连接数据库sql.DB增删改查插入数据更新数据查询数据删除数据总结前言:本篇文章对如何使用golang连接并操作postgre数据库进行了简要说明。文中使用到的主要工具:DBeaver21、VSCode,Golang1.17。以用户,文章,评论三个表作为例子,下面是数据库建表sql:CREATE TABLE public.user_info ( ......
398
0
0
2023-02-21