一个守护进程执行的问题
本文的主线 App => Shell => PM2 => Summary App vim demo.js var http = require('http'); function random(Min, Max) { var Range = Max - Min; var Rand = Math.random(); return (Min + Math.round(Rand * Range)); } var num = random(5000, 50000); console.log(num); ...阅读全文
利用 go/ast 语法树做代码生成
需求概述go.uber.org/zap 日志包性能很好,但是用起来很不方便,虽然新版本添加了 global 方法,但仍然别扭:zap.S().Info()。现在我们的需求就是将 zap 的 sugaredLogger 封装成一个包,让它像 logrus 一样易用,直接调用包内函数:log.Info()。我们只需要找到`SugaredLogger这个 type 拥有的 Exported 方法,将其改为函数,函数体调用其同名方法:func Info(args ...interface{}) { _g...阅读全文
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿。但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都...
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿。但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明。请返回最后获胜者的分数。 福哥答案2021-02-15: 这道题直接背,用自然智慧很难想到,平时需要锻炼敏感度。 1.递归。有代码。 先手 依赖 后手递归加数组元素的最大值。 后手 依赖 先手递归的最小值。 为了方便记忆,先手选大的,后手被迫选小的。实际上,先手和后手都是尽自己的努力选大的。这表...阅读全文
golang 读写锁 sync.RWMutex
golang 读写锁 sync.RWMutex 之前的博客讲了使用互斥锁 sync.Mutex 来保证同一个时刻只有一个goroutine可以访问临界区(内部有共享变量)。当时更多时候,goroutine不是要修改共享变量,只是要读取就行,而互斥锁是完全互斥的。针对这种情况,golang中提供了读写锁 **sync.RWMutex ** ——它 不限制资源的并发读,但是读写、写写操作无法并行执行,这种锁叫作“多读单写”锁(multiple readers, single writer lock)...阅读全文
Ubuntu配置Golang
下载golang安装包,解压后在安装包目录下输入命令 sudo cp -r ./go usr/local 在home目录创建 gowork文件夹 cd /home mkdir gowork cd gowork mkdir bin src pkg 配置 ~/.bashrc 和 /etc/profile 在最后一行加入以下内容(发现只配置/etc/profile只在当前窗口有效,配置完成后source一下,重启确认一下): # golang setting export GOROOT=/usr/lo...阅读全文
Golang学习笔记for循环语句
title: "Golang学习笔记for循环语句" date: 2021-02-09T23:33:13+08:00 draft: true tags: ['go'] author: "dadigang" author_cn: "大地缸" personal: "http://www.real007.cn" 关于作者 http://www.real007.cn/about Golang学习笔记(九)for循环语句 Golang的for相较于java,并不需要使用()括起来,基础for循环格式为fo...阅读全文
手撸golang 基本数据结构与算法 栈
手撸golang 基本数据结构与算法 栈 缘起 最近阅读<<我的第一本算法书>>(【日】石田保辉;宫崎修一) 本系列笔记拟采用golang练习之 栈 栈(也叫堆栈)也是一种数据呈线性排列的数据结构, 不过在这种结构中, 我们只能访问最新添加的数据。 栈就像是一摞书, 拿到新书时我们会把它放在书堆的最上面, 取书时也只能从最上面的新书开始取。 像栈这种最后添加的数据最先被取出, 即“后进先出”的结构, 我们称为Last In First Out,简称LIFO。 摘自 <<我的第一本算法书>>(【日...阅读全文
聊聊dubbo-go-proxy的ZookeeperRegistryLoad
序本文主要研究一下dubbo-go-proxy的ZookeeperRegistryLoadLoaderdubbo-go-proxy/pkg/registry/load.go// Loader this interface defined for load services from different kinds registry, such as nacos,consul,zookeeper. type Loader interface { // LoadAllServices load al...阅读全文
手撸golang 基本数据结构与算法 栈
手撸golang 基本数据结构与算法 栈缘起最近阅读<<我的第一本算法书>>(【日】石田保辉;宫崎修一)本系列笔记拟采用golang练习之栈栈(也叫堆栈)也是一种数据呈线性排列的数据结构, 不过在这种结构中, 我们只能访问最新添加的数据。 栈就像是一摞书, 拿到新书时我们会把它放在书堆的最上面, 取书时也只能从最上面的新书开始取。 像栈这种最后添加的数据最先被取出, 即“后进先出”的结构, 我们称为Last In First Out,简称LIFO。 摘自 <<我的第一本算法书>>(【日】石田保辉...阅读全文
手撸golang 基本数据结构与算法 链表
手撸golang 基本数据结构与算法 链表 缘起 最近阅读<<我的第一本算法书>>(【日】石田保辉;宫崎修一) 本系列笔记拟采用golang练习之 链表 链表是数据结构之一,其中的数据呈线性排列。 每个数据节点都有1个“指针”,它指向下一个数据的内存地址。 访问数据时,我们需要从链表头部开始查找(线性查找), 如果目标数据在链表最后的话,需要的时间就是O(n)。 另外,添加数据只需要更改两个指针的指向,所以耗费的时间与n无关。 如果已经到达了添加数据的位置,那么添加操作只需花费O(1)的时间。 ...阅读全文
手撸golang 基本数据结构与算法 链表
手撸golang 基本数据结构与算法 链表缘起最近阅读<<我的第一本算法书>>(【日】石田保辉;宫崎修一)本系列笔记拟采用golang练习之链表链表是数据结构之一,其中的数据呈线性排列。 每个数据节点都有1个“指针”,它指向下一个数据的内存地址。 访问数据时,我们需要从链表头部开始查找(线性查找), 如果目标数据在链表最后的话,需要的时间就是O(n)。 另外,添加数据只需要更改两个指针的指向,所以耗费的时间与n无关。 如果已经到达了添加数据的位置,那么添加操作只需花费O(1)的时间。 删除数据同...阅读全文
2021-02-14:假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2,开始时机器人在其中的M位置上(M 一定是 1~N 中的一个)。如果机器人来到1位置,那么下一步只能往右来到2位...
2021-02-14:假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2,开始时机器人在其中的M位置上(M 一定是 1~N 中的一个)。如果机器人来到1位置,那么下一步只能往右来到2位置;如果机器人来到N位置,那么下一步只能往左来到 N-1 位置;如果机器人来到中间位置,那么下一步可以往左走或者往右走;规定机器人必须走 K 步,最终能来到P位置(P也是1~N中的一个)的方法有多少种?给定四个参数 N、M、K、P,返回方法数。 福哥答案2021-02-14: 自然智慧即可。 1.递归。有...阅读全文
tidb-lite: 用于 Golang 数据库相关代码的单元测试
使用 tidb-lite 可以在 Golang 代码中运行 mocktikv 模式的 TiDB。 tidb-lite 可以用于数据库相关代码的单元测试,如果你的应用使用到了 MySQL/TiDB,就会有大量的数据库相关的代码要进行单元测试。 另外,有的应用希望在本地持久化一些数据,并且以数据库的方式存储,方便对数据进行管理。这种场景下也可以使用 tidb-lite,开发者使用兼容 MySQL 协议的 SQL 对数据进行本地处理。 本文主要介绍如何使用 tidb-lite 进行数据库相关代码的单元...阅读全文
聊聊dubbo-go-proxy的ConsulRegistryLoad
序本文主要研究一下dubbo-go-proxy的ConsulRegistryLoadLoaderdubbo-go-proxy/pkg/registry/load.go// Loader this interface defined for load services from different kinds registry, such as nacos,consul,zookeeper. type Loader interface { // LoadAllServices load all s...阅读全文
Go 语言 协程和管道讲解
参考链接: 角度6-管道Go 语言 协程和管道讲解 一、进程和线程基本说明: 进程是程序在操作系统中一次执行过程,是系统进行资源分配和调度的基本单位;线程是进程的一个执行实例,是程序最小单元,它是比进程更小的能独立运行的基本单位;一个进程可创建和销毁多个线程,同一个进程的多个线程可以并发执行;一个程序至少有一个进程,一个进程至少有一个线程; 举个栗子: 使用的迅雷客户端,打开迅雷就是开启了一个进程,而下载多个视频,就是多个线程在工作; 二、并发、并行简单说明: 1.并发: 多线程程序在单核上运行...阅读全文
聊聊dubbo-go-proxy的Route
序本文主要研究一下dubbo-go-proxy的RouteRoutedubbo-go-proxy/pkg/router/route.go// Route defines the tree of router APIs type Route struct { lock sync.RWMutex tree *avltree.Tree wildcardTree *avltree.Tree } // NewRoute returns an empty router tree func NewRoute(...阅读全文
Golang 获取当前外网IP/地址/运营商
通过 Golang 获取当前外网IP、地址、运营商 代码 package main import ( "fmt" "io/ioutil" "net/http" ) func main() { responseClient, errClient := http.Get("http://ip.dhcp.cn/?ip") // 获取外网 IP if errClient != nil { fmt.Printf("获取外网 IP 失败,请检查网络\n") panic(errClient) } // 程序在...阅读全文
手撸golang 基本数据结构与算法 数组
手撸golang 基本数据结构与算法 数组 缘起 最近阅读<<我的第一本算法书>>(【日】石田保辉;宫崎修一) 本系列笔记拟采用golang练习之 数组 数组是一种线性数据结构, 数据按顺序存储在内存的连续空间内。 每个数据的内存地址(在内存上的位置)都可以通过数组下标算出, 我们也就可以借此直接访问目标数据(这叫作“随机访问”)。 访问数据时使用的是随机访问(通过下标可计算出内存地址), 所以需要的运行时间仅为恒定的O(1)。 但另一方面,想要向数组中添加新数据时,必须把目标位置后面的数据一个...阅读全文