vscode中的debug配置
vscode 是可定制化程度非常高的编辑器,可玩性很高的同时也带来了一定的门槛
本文以 Go 语言程序为例子介绍实现想要实现如下的功能要如何配置 launch.json
需要带命令行参数进行调试
需要控制台持续输入进行调试
需要同时调试多个进程
vscode 需要带命令行参数进行调试配置 args 参数,数组中的每个元素会以此放在启动命令后
1234567891011121314151617{ "version": "0.2.0", "configurations": [ { "name": "Launch Package", "type": "go", "request": "launch", "mode& ...
git 中的各种撤销操作
工作区回滚:文件修改错误使用 git checkout 命令
1234# 查看指定文件的历史版本$ git log <filename># 回滚到指定commitID$ git checkout <commitID> <filename>
暂存区回滚:git add 添加了多余文件这样的错误是由于直接 go add . 一把梭,把当前目录所有文件都暂存了,不小心就会提交其他文件
撤销操作
12345678# 先看一下add 中的文件git status # 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了 ,HEAD 可以不写,直接git resetgit reset HEAD# 就是对某个文件进行撤销了,HEAD 可以不写,直接git reset XX文件git reset HEAD XXX/XXX/XXX.java
本地仓库回滚:git commit 了错误文件如果不小心 弄错了 git add后 , 又 git commit 了,但还没push到远程。
先使用 git log 查看 commit 节点的信息,关 ...
Git Basic CheatSheet
01 Git configurationSet the name that will be attached to your commits and tags.
1git config --global user.name "Your Name"
Set the e-mail address that will be attached to your commits and tags.
1git config --global user.email "you@example.com"
Enable some colorization of Git output.
1git config --global color.ui auto
02 Starting a projectCreate a new local repository in the current directory. If [project name] is provided, Git will create a new directory named [proj ...
Bash Basic CheatSheet
BashShebangSpecial comment, specifies that the file is a script and calls a certain interpreter (i.e., bash, sh, python)
1234567#!/bin/bash#!/bin/sh#!/usr/bin/env python#!/usr/bin/python
CommentsUse a pound/sharp/hashtag without a ! to write comments
1# This is a comment
Variablesshell variables
Whitespace matters!
Use $VAR to output the value of variable VAR
Display text with echo
12NAME="value"echo "$NAME"
Types? What types?
Bash variables are untyped
Opera ...
Docker Basic CheatSheet
Basic Commands:Container Lifecycle:docker run: Create and start a container.
1$ docker run -d -name my_container nginx
docker start/stop/restart: Start, stop, or restart a container.
123$ docker stop my_container$ docker start my_container$ docker restart my_container
docker ps: List running containers.
1$ docker ps
docker ps -a: List all containers (including stopped ones).
1$ docker ps -a
Image Management:docker pull: Fetch an image from a registry.
1$ docker pull ubuntu
do ...
sync.Mutex:标准库的互斥锁实现
是什么sync.Mutex 是 go 原生提供的互斥锁实现,也是最基本的同步原语了
合理利用锁即可避免并发编程中由于竞争引发的一些逻辑错误
Quick Startsync.Mutex 对外暴露的接口有三个
sync.Mutex.Lock 请求锁,如果锁忙,则阻塞。
sync.Mutex.TryLock 请求锁,如果锁忙则,则返回 false。这是非阻塞的获取锁的方式。
sync.Mutex.Unlock 释放锁
一个简单的例子:
123456789101112131415161718192021package mainimport ( "sync" "time")func main() { var m sync.Mutex cnt := 0 for i := 0; i < 10; i++ { go func() { m.Lock() cnt++ m.Unlock() }() } time.Sleep(time.Second) // 保证所有协程执行完 fmt.Print ...
sync.Once: 执行且仅仅执行一次动作
是什么sync.Once 是 Go 语言中的一种同步原语,用于确保某个操作或函数在并发环境下只被执行一次。
它只有一个导出的方法,即 Do,该方法接收一个函数参数。在 Do 方法被调用后,该函数将被执行,而且只会执行一次,即使在多个协程同时调用的情况下也是如此。
解决了什么问题对于同一个 sync.Once 实例,可以确保通过调用 Do 执行传入 Do 中的方法,执行且仅执行一次
主要用于以下场景
单例模式:确保全局只有一个实例对象,避免重复创建资源
延迟初始化:在程序运行过程中需要用到某个资源时,通过 sync.Once 动态地初始化该资源
只执行一次的操作:例如只需要执行一次的配置加载、数据清理等操作
Quick Start创建和使用
12345678910once := sync.Once{}for i := 0; i < 10; i++ { go func() { once.Do(func(){ fmt.Println("hello") }) }()}time. ...
lumberjack: 滚动日志源码走读
是什么Lumberjack 是一个用于将日志写入滚动文件的 Go 包,旨在成为日志系统基础设施的一部分。它不是一个一体化的解决方案,而是日志记录堆栈底部的一个可插入组件,仅控制写入日志的文件。
解决了什么问题
无侵入式的日志切割
关注点分离:只关注日志的文件管理
Quick Start1234567log.SetOutput(&lumberjack.Logger{ Filename: "/var/log/myapp/foo.log", MaxSize: 500, // megabytes MaxBackups: 3, MaxAge: 28, //days Compress: true, // disabled by default})
只需使用 *lumberjack.Looger 结构作为 io.WriteCloser 的实现替代例如 os.File 结构等,传入各类日志 logger 的配置中作为输出目标,即可将日志写入滚动文件
日志文件分割:日志文件大小超过限制,将日志归档 ...
ants: 协程池源码学习
是什么ants是一个高性能的 goroutine 池,实现了对大规模 goroutine 的调度管理、goroutine 复用,允许使用者在开发并发程序的时候限制 goroutine 数量,复用资源,达到更高效执行任务的效果。
解决了什么问题
提升性能:主要面向一类场景,大批量轻量级并发任务,任务执行成本与协程创建/销毁成本量级接近
并发资源控制:研发能够明确系统全局并发度以及各个模块的并发度上限
协程生命周期控制:实时查看当前全局并发的协程数量;有一个统一的紧急入口释放全局协程
带来的价值:
限制并发的 goroutine 数量
复用 goroutine,减轻 runtime 调度压力,提升程序性能
规避过多的 goroutine 侵占系统资源(CPU&内存)
Quick Start创建 goroutine 池
1pool, _ := ants.NewPool(100)
提交任务
123ants.Submit(func(){ // do something})
动态调整容量
12pool.Tune(1000) // Tune its ...
hugo + github pages: 零成本自建技术博客
方案选择github pages 提供博客站点 + hugo 提供博客模板 + github actions 自动构建和发布
part 1 : Github Pages官网:GitHub Pages
选择 github pages 的优点就是 github 使用频率高,并且作为全球最大的代码托管平台,也很稳定,即使是免费提供使用也不用担心跑路的问题,缺点当然就是对于国内的网络访问不算友好
步骤如下:
新建 Repositories 用于存储博客内容,注意:名称格式为:<用户名>.github.io
将博客网页代码上传至仓库中
访问博客,博客站点访问地址为:**https://<用户名>.github.io/**
part 2 : hugo官网:The world’s fastest framework for building websites | Hugo (gohugo.io)
hugo 是使用 go 语言实现的静态博客网站生成器,可将 md 文章内容转换为美观的博客网站代码
步骤如下:
安装 git 用于将博客网页上传 Github, 安装 hugo ...