package main import ( "testing" ) // 第一种 func BenchmarkMake(t *testing.B) { t.ResetTimer() origin := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} for i := 0; i < t.N; i++ { target := m
packagemainimport("flag""fmt""io/ioutil""log""os""os/exec""path/filepath""strings")//获取指定目录及所有子目录下的所有文件,可以匹配后缀过滤。funcWalkDir(dirPthstring)(dirs[]string,errerror){dirs=make([]string,0,20)//遍历目录err=file
registerHandlers.gopackagerouterimport("../ctrl""../funcs""github.com/julienschmidt/httprouter""net/http")typemiddleWareHandlerstruct{r*httprouter.Router}funcNewMiddleWareHandler(r*httprouter.Router)h
import ( "fmt" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" "../../funcs")// id从1开始递增func GenId(db *mgo.Database) (int64, error) { IDInt64 := struct { Value int64 `bson:"max_id"` }{Value:
项目结构:crontab(项目名) /master /worker /commongo语言本身是多线程的,开发的时候用的是协程,协程会被调度到线程上,线程是操作系统概念,要发挥golang的多核优势,就让它的线程数量和cpu数量相等。
crontab是单机工具(所有worker都在调度,如果有1000个任务,所有worker都在调用者1000个任务。对于编译型语言来说,排序一个一千万的数组只需要一秒,对于一千一万的调度,无需担心性能)(相当于完成一个到worker集群的通知,通知它们杀死任务)
后台启动mongodb服务器端:nohup./bin/mongod--dbpath=./data&packagemain//导入import("context""fmt""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/bson/primitive""go.mongodb.org/mongo-driver/mong
packagemainimport("go.etcd.io/etcd/clientv3""time""fmt""context")funcmain(){var(configclientv3.Configclient*clientv3.Clienterrerrorleaseclientv3.LeaseleaseGrantResp*clientv3.LeaseGrantResponseleaseIdc
packagemainimport("go.etcd.io/etcd/clientv3""time""fmt""context")funcmain(){var(configclientv3.Configclient*clientv3.Clienterrerrorkvclientv3.KVputOpclientv3.OpgetOpclientv3.OpopRespclientv3.OpRespons
监听etcd中的kv变化,常用来做集群中的配置下发、状态同步,非常有价值。packagemainimport("go.etcd.io/etcd/clientv3""time""fmt""context""go.etcd.io/etcd/mvcc/mvccpb")funcmain(){var(configclientv3.Configclient*clientv3.Clienterrerrorkvc
对于实现分布式乐观锁非常重要。如果锁了,突然宕机了,锁是需要自动释放的。所以这锁在etcd里是需要生命期的。过期演示:packagemainimport("context""fmt""go.etcd.io/etcd/clientv3""time")funcmain(){var(configclientv3.Configclient*clientv3.Clienterrerrorleaseclien
连接etcd:packagemainimport("fmt""go.etcd.io/etcd/clientv3""time")var(configclientv3.Configclient*clientv3.Clienterrerror)funcmain(){//客户端配置config=clientv3.Config{Endpoints:[]string{"0.0.0.0:2379"},//集群列
下载,解压,进入目录,运行:[root@bogonetcd-v3.3.12-linux-amd64]#./etcd--listen-client-urls'http://0.0.0.0:2379'--advertise-client-urls'http://0.0.0.0:2379'(本地etcd的端口)etcd控制工具:[root@bogonetcd-v3.3.1
etcd是将数据存储在集群中的高可用k-v存储。允许应用实时监听存储中的k-v变化。能容忍单点故障,能够应对网络分区。(raft是一个分布式协议,管理的是日志;etcd管理的是k-v,把k-v放到日志里,kv就编程分布式集群了)(调用者写入请求发给leader请求写入k-v,leader会将日志实时向follower们复制,leader不会立即返回给调用者,会马上往集群follower做日志拷贝。
cron格式:分时日月周每隔5分钟执行1次:/5*echohello>/tmp/x.log每隔1-5分钟执行1次:1-5echohello>/tmp/x.log每天10点整、22点整执行1次:010,22*echohello>/tmp/x.log每隔1-5分钟执行1次:1-5echohello>/tmp/x.logParse():解析与校验Cron表达式Next():根据当
packagemainimport("fmt""os/exec")funcmain(){var(cmd*exec.Cmderrerror)cmd=exec.Command("/bin/bash","-c","echo1")err=cmd.Run()fmt.Println(err)}packagemainimport("fmt""os/exec")funcmain(){var(cmd*exec.Cm
uid是服务端给客户端种下的cookie。比如访问百度,同一台电脑同一个浏览器,不管是百度哪个页面,都是这个uid:
packagemainimport("./uas""flag""math/rand""net/url""os""strconv""strings""time")typeresourcestruct{urlstringtargetstringstartintendint}funcruleResource()[]resource{varres[]resource//首页r1:=resource{url
Nginx的405错误绝大多数服务器,都不允许静态文件响应POST请求(GET请求静态文件是天经地义的),否则会返回HTTP/1.1 405 Method not allowed错误。然而在前端开发中,前端开发工程师经常模拟后端请求,返回静态数据来查看页面效果,怎么办?目前有两种方案解决:方案一:修改配置文件nginx.conf(推荐)在nginx.conf中,请求的静态数据路径中,添加如下语句e
版本一:datafile1.go:packagev1import("errors""io""os""sync")//Data代表数据的类型。typeData[]byte//DataFile代表数据文件的接口类型。typeDataFileinterface{//Read会读取一个数据块。Read()(rsnint64,dData,errerror)//Write会写入一个数据块。Write(dDat
载荷测试通常需要知道一个软件的下列问题:QPS和TPS: 对资源的消耗也要考虑: 载荷的处理超时时间: 据此,我们针对某一个载荷的结果中至少包含3块内容,即: 已知,数组和切片都不是并发安全的,go原生的数据类型中只有通道是并发安全的,它是收纳结果的绝佳勇气。因此,我将这样一个通道类型的字段也加入在载荷发生器的类型声明中。
应用场景举例:一个任务管道满了,再往里面塞就塞不进去了,浏览器刷不出来了。用户即便关了浏览器可能依然在阻塞......package main import "fmt"import "time"func main() { var ch cha
单向channel近日在面试中有提到过单向channel。问我是否了解。之前在golang的官方库中确实有看到相应的单向channel的例子,如context包,以及在使用第三方包imap的时候也有使用单向channel,那个是作为通知使用。这里再总结一下单向channel的语法以及为什么使用单向channel的一些看法。语法chan<- //指向channel 表示&n
//创建一个整型切片//其长度和容量都是4个元素slice:=[]int{10,20,30,40}//迭代每一个元素,并显示其值forindex,value:=rangeslice{fmt.Printf("Index:%dValue:%d\n",index,value)}Output:Index:0Value:10Index:1Value:20Index:2Value:30Index:3Value
packagemainimport("github.com/gorilla/websocket""net/http""log")var(PushMessage=make(chanmessage,100)Clients=make(map[string]*websocket.Conn))var(//http升级websocket协议的配置upgrader=websocket.Upgrader{//允许
packagemainimport("github.com/gorilla/websocket""net/http""log""fmt")typeMessagestruct{Msgstring//消息内容ToIdstring//目标用户的idFromIdstring//发送消息的用户的id}varclients=make(map[string]*websocket.Conn)//连接客户端(在线的
packagemainimport("log""net/http""github.com/gorilla/websocket""fmt")varclients=make(map[*websocket.Conn]bool)//连接客户端varbroadcast=make(chanMessage,100)//广播频道//配置upgradervarupgrader=websocket.Upgrader{
packagemainimport("net/http""github.com/julienschmidt/httprouter""io")//第三个参数p是httprouter新增的funcCreateUser(whttp.ResponseWriter,r*http.Request,phttprouter.Params){//io.WriteString(w,"createuser")io.Wr
写在前面用go开发web项目时,经常会用到redis,推荐使用redigo包,目前有4800多个star,基本不会有太大的坑。https://github.com/gomodule/redigo聊聊redis的i/o并发Redis is single-threaded with epoll/kqueue and scales indefinitely in terms of I/O concurr
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号