go语言
Go语言是针对多处理器系统应用程序的编程进行优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。
wilson_go
这个作者很懒,什么都没留下…
展开
-
kafka的epoch
Leaderepoch(1,120)说明这个leader的版本号为1,版本的起始位置是第120条消息开始的KafkaBroker会在内存中为每个分区都缓存LeaderEpoch数据,同时它还会定期地将这些信息持久化到一个checkpoint文件中。当Leader副本写入消息到磁盘时,Broker会尝试更新这部分缓存。这样,每次有Leader变更时,新的Leader副本会查询这部分缓存,取出对应的LeaderEpoch的起始位移,以避免数据丢失和不一致的情况。...原创 2022-07-31 19:58:12 · 1447 阅读 · 0 评论 -
tcp框架需要解决的问题
不能让goroutine无限扩张,固定数目,处理。worker从消息队列从消费消息,处理。处理消息,利用用户注册的回调函数,处理完结束。根据客户端消息的类型,分配messageID,根据messageID识别消息,绑定回调函数,调用相应的函数处理。当把数据处理完,发送到消息队列中,如发送到第五个消息队列5worker5读到消息,worker去apis中找。7、自动启动固定数目的workergoroutine进行消息的处理,避免goroutine的无线扩张。2、自动封包,解包,解决TCP粘包问题。...原创 2022-07-23 21:20:16 · 681 阅读 · 0 评论 -
encoding包
package encodingimport "encoding"encoding包定义了供其它包使用的可以将数据在字节水平和文本表示之间转换的接口。encoding/gob、encoding/json、encoding/xml三个包都会检查使用这些接口。因此,只要实现了这些接口一次,就可以在多个包里使用。标准包内建类型time.Time和net.IP都实现了这些接口。接口是成对的,分别产生和还原编码后的数据。Index返回首页type BinaryMarshalertype BinaryUn原创 2022-05-21 22:00:24 · 468 阅读 · 0 评论 -
crypto包
package cryptoimport "crypto"crypto包搜集了常用的密码(算法)常量。Index返回首页type PublicKeytype PrivateKeytype Hashfunc (h Hash) Available() boolfunc (h Hash) Size() intfunc (h Hash) New() hash.Hashfunc RegisterHash(h Hash, f func() hash.Hash)type PublicKeyty原创 2022-05-21 14:08:45 · 771 阅读 · 0 评论 -
golang中net包
package netimport "net"net包提供了可移植的网络I/O接口,包括TCP/IP、UDP、域名解析和Unix域socket。虽然本包提供了对网络原语的访问,大部分使用者只需要Dial、Listen和Accept函数提供的基本接口;以及相关的Conn和Listener接口。crypto/tls包提供了相同的接口和类似的Dial和Listen函数。Dial函数和服务端建立连接:conn, err := net.Dial("tcp", "google.com:80")if err原创 2022-05-19 21:17:57 · 1257 阅读 · 0 评论 -
runtime包
package runtimeimport "runtime"runtime包提供和go运行时环境的互操作,如控制go程的函数。它也包括用于reflect包的低层次类型信息;参见reflect报的文档获取运行时类型系统的可编程接口。Environment Variables下面的环境变量($name或%name%,这依赖于主机的操作系统)控制go程序的运行时行为。它们的含义和用法可能在各发行版之间改变。环境变量GOGC设置最初的垃圾收集目标百分比。当新申请的数据和前次垃圾收集剩下的存活数据的原创 2022-05-18 20:29:58 · 468 阅读 · 0 评论 -
unsafe包
package unsafeimport “unsafe”unsafe包提供了一些跳过go语言类型安全限制的操作。Index返回首页type ArbitraryTypetype Pointerfunc Sizeof(v ArbitraryType) uintptrfunc Alignof(v ArbitraryType) uintptrfunc Offsetof(v ArbitraryType) uintptrtype ArbitraryTypetype ArbitraryType i原创 2022-05-17 20:07:05 · 137 阅读 · 0 评论 -
binary包
binary包实现了简单的数字与字节序列的转换以及变长值的编解码。数字翻译为定长值来读写,一个定长值,要么是固定长度的数字类型(int8, uint8, int16, float32, complex64, …)或者只包含定长值的结构体或者数组。变长值是使用一到多个字节编码整数的方法,绝对值较小的数字会占用较少的字节数。详情请参见:http://code.google.com/apis/protocolbuffers/docs/encoding.html。本包相对于效率更注重简单。如果需要高效的序列化原创 2022-05-16 20:35:27 · 415 阅读 · 0 评论 -
gops进程诊断 详解
安装go get -u github.com/google/gops常规命令gops 工具包含了大量的分析命令,我们可以通过 gops help 进行查看:$ gops helpgops is a tool to list and diagnose Go processes.Usage:gops <cmd> <pid|addr> ...gops <pid> # displays process infogops help # displays th原创 2022-02-19 17:08:21 · 1333 阅读 · 0 评论 -
gops程序火图
安装go get -u github.com/google/gops使用package mainimport ( "log" "time" "github.com/google/gops/agent")func main() { if err := agent.Listen(agent.Options{}); err != nil { log.Fatal(err) } time.Sleep(time.Hour)}原创 2022-02-17 22:55:36 · 246 阅读 · 0 评论 -
go中race数据竞态用法
func main() { fmt.Println(getNumber())}func getNumber() int { var i int go func() { i = 5 }() return i}检查竟态Go(从v1.1开始)具有内置的数据竞争检测器,可以使用它来查明潜在的数据竞争条件。使用它就像-race在普通的Go命令行工具中添加标志一样简单。运行时检查竟态的命令:go run -race main.go构建时检查竟态的命令:go build -race m原创 2022-02-16 12:28:18 · 1607 阅读 · 0 评论 -
go语言:环境变量GOPROXY
golang默认的GOPROXY是https://goproxy.io,这个是官方的设置,我们可以使用国内的代理,Windows下设置如下:打开终端并执行go env -w GOPROXY=https://goproxy.cn,direct其中**-w** 表示 写 操作。原创 2021-09-24 10:17:39 · 629 阅读 · 0 评论 -
Golang-Map中value是不可寻址可使用指针类型代替
Golang Map元素取址:package mainimport "fmt"type UserInfo struct { Uid string `json:"uid"` UserName string `json:"user_name"` Sex int `json:"sex"`}func main() { var user = make(map[string]UserInfo) uid := "0001" user[u原创 2021-08-25 21:18:21 · 1070 阅读 · 0 评论 -
正则表达式语法规则
正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活,按照它的语法规则,根据需求构造出的正则表达式能够从原始文本中筛选出几乎任何你想要得到的字符组合。Go语言通过 regexp 包为正则表达式提供了官方支持,其采用 RE2 语法,除了\c、\C外,Go语言和 Perl、Python 等语言的正则基本一致。正则表达式语法规则正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")构成的文字序列,可以是单个的字符、字符集合、字原创 2021-08-04 20:26:04 · 996 阅读 · 0 评论 -
goland 保存时自动格式化代码 fmt
goland idea可以帮助我们在保存时自动格式化代码下面列一下 goland 怎么配置:file-setting2. tools-file watchers3. 添加go fmt4. 测试 编写代码(ctrl+s),保存并格式化代码原创 2021-07-13 19:29:14 · 1428 阅读 · 0 评论 -
Interface 合理性验证
在编译时验证接口的符合性。这包括:将实现特定接口的导出类型作为接口API 的一部分进行检查实现同一接口的(导出和非导出)类型属于实现类型的集合任何违反接口合理性检查的场景,都会终止编译,并通知给用户补充:上面3条是编译器对接口的检查机制, 大体意思是错误使用接口会在编译期报错. 所以可以利用这个机制让部分问题在编译期暴露.如果 *Handler 与 http.Handler 的接口不匹配, 那么语句 var _ http.Handler = (*Handler)(nil) 将无法编译通过.赋值原创 2021-06-22 15:26:32 · 384 阅读 · 0 评论 -
gomicro使用etcd
protosyntax = "proto3";package greeter;service GreeterService{ rpc Greet(GreetRequest) returns (GreetResponse) {}}message GreetRequest { string greeting = 1; string name = 2;}message GreetResponse{ string response = 1;}client原创 2021-06-03 15:21:18 · 315 阅读 · 0 评论 -
ubuntu+docker搭建etcd集群
l1sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose2sudo chmod +x /usr/local/bin/docker-composewilson@wilson-virtual-machine:~$ sudo chmod +x /usr/local/b原创 2021-06-03 11:17:19 · 516 阅读 · 0 评论 -
slice添加map和filter方法
package mainimport (“fmt”“strings”)// WorkWith会实现集合接口type WorkWith struct {Data stringVersion int}// Filter是一个过滤函数。func Filter(ws []WorkWith, f func(w WorkWith) bool) []WorkWith {// 初始化返回值result := make([]WorkWith, 0)for _, w := range ws {原创 2021-06-02 10:03:57 · 373 阅读 · 0 评论 -
Gin middleware中间件
package mainimport( "fmt" "github.com/gin-gonic/gin")func Hello(c *gin.Context) { resp := map[string]string{"hello":"world"} c.JSON(200, resp)}func DummyMiddleware(c *gin.Context) { fmt.Println("Im a dummy!") c.Next()}func main() { api :原创 2021-06-01 20:00:30 · 595 阅读 · 0 评论 -
golang的mongodb显示执行的sql语句
// 实现 mongo.Logger 的接口 type MongoLog struct { } func (MongoLog)Output(calldepth int, s string) error { log.SetFlags(log.Lshortfile) return log.Output(calldepth,s) } mgo.SetDebug(true) // 设置DEBUG模式 mgo.SetLogger原创 2021-06-01 19:16:50 · 2951 阅读 · 3 评论 -
gin拦截request的参数数据
package mainimport ( "encoding/json" "fmt" "github.com/gin-gonic/gin" "io/ioutil")func main() { router := gin.New() router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string { all, _ := ioutil.ReadAll(param.Request.Body)原创 2021-06-01 16:34:14 · 1116 阅读 · 0 评论 -
gin拦截response的数据
package mainimport ( "bytes" "fmt" "github.com/gin-gonic/gin""net/http")type bodyLogWriter struct { gin.ResponseWriter body *bytes.Buffer}func (w bodyLogWriter) Write(b []byte) (int, error) { w.body.Write(b) return w.ResponseWriter.Write(b)原创 2021-06-01 16:32:38 · 3807 阅读 · 0 评论 -
Go中defer、return、返回值之间执行顺序
Go语言中延迟函数defer充当着 cry…catch 的重任,使用起来也非常简便,然而在实际应用中,很多gopher并没有真正搞明白defer、return和返回值之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱!先来运行下面两段代码:A. 无名返回值的情况package mainimport (“fmt”)func main() {fmt.Println(“return:”, a()) // 打印结果为 return: 0}func a() int {var i int原创 2021-05-19 10:32:12 · 604 阅读 · 0 评论 -
pprof 的使用
基本介绍pprof 是在做性能优化前的性能分析工具。安装: go get -u github.com/google/pprof两个工具服务型应用 _ “net/http/pprof” 包,专用于采集 web 服务 运行数据的分析工具型应用 “runtime/pprof” 包,专用于采集 应用程序 运行数据的分析另外 go tool pprof 是命令行指令,用于获取和分析 Profiling 数据,源数据可以是 http 地址,也可以是本地 Profile 文件;查看模式可以命令行交互模式,也可原创 2021-05-18 19:27:59 · 537 阅读 · 1 评论 -
找寻golang未实现接口的方法
有时候,有些方法由于错误的修改或者落掉了,但是编译器提示信息不太强烈,非常不太好找具体哪个方法没有实现,也很难寻找定位具体的方法或者接口的不一致导致出错。首先分析一下由于golang的interface使用很灵活,不需要显示的实现接口interface的方法, 有点动态化的感觉,缺点:如果没有实现interface的方法,强行转换成interface,运行时候异常报错解决办法:在编译的时候就把这种错误抛出来,上代码:package mainimport ( "fmt")type val原创 2021-04-21 21:54:21 · 1024 阅读 · 0 评论 -
context包
emptyCtx,所有ctx的根,用context.TODO(),或context.Background()来生成。type emptyCtx intvalueCtx,主要就是为了在ctx中嵌入上下文数据,一个简单的k和v结构,同一个ctx内支持一对kv,需要更多的kv的话,会形成一颗树形结构type valueCtx struct { Context key, val interface{}}func (e *emptyCtx) String() string {switch e {原创 2021-02-21 14:44:44 · 203 阅读 · 0 评论 -
interface实现分析
在runtime包下的runtime2.go文件中Go使用iface和eface来表达interface。iface其实就是内部有函数的interfaceeface表示empty interface,从逻辑上来说,既然空接口没有任何函数,那所有对象就自然都实现了该interface。空接口type eface struct {_type *_typedata unsafe.Pointer}type _type struct {size uintptrptrdata u原创 2021-02-21 13:54:26 · 342 阅读 · 0 评论 -
golang自定义time格式输出
package jsontestimport ( "encoding/json" "testing" "time")type Time time.Timeconst ( timeFormart = "2006-01-02 15:04:05")func (t *Time) UnmarshalJSON(data []byte) (err error) { now, err := time.ParseInLocation(`"`+timeFormart+原创 2020-11-29 14:23:41 · 878 阅读 · 1 评论 -
gofmt 保存时自动格式化代码 fmt
在这里设置一下就好了原创 2020-09-19 18:02:42 · 494 阅读 · 0 评论 -
connection pool exhausted
1.发现问题生产环境发现有一些redis报错日志 connection pool exhausted。如果redis中没有数据 就直接回源 查DB。暂时不会有什么大问题。中文意思是连接池耗尽。2.追踪问题查看源码我们用的redis客户端类似于redigo 按照错误提示搜索到了一段代码(基于最新的redigo 源码版本分析)// Handle limit for p.Wait == false.if !p.Wait && p.MaxActive > 0 &&原创 2020-08-24 14:39:26 · 1486 阅读 · 0 评论 -
golang美国纽约时间
format := "2006-01-02 15:04:05" day := time.Now().Format("2006-01-02 15:04:05") local, _ := time.LoadLocation("America/New_York") t, _ := time.ParseInLocation(format, day, local) fmt.Println(t.UnixNano() / 1e6)原创 2020-08-03 11:12:03 · 786 阅读 · 0 评论 -
go程控制
package mainimport ( "context" "fmt" "time" "runtime")func test(ctx context.Context,cancelFunc func()) { var i int for { select { case <-ctx.Done(): fmt.Println("test done....") return default: fmt.Printf("执行第%d次go程\n",i) if原创 2020-07-20 16:18:45 · 194 阅读 · 0 评论 -
golang的context基础
package mainimport ( "context" "fmt" "time")func main() { ctx, cancel := context.WithCancel(context.Background()) eatNum := chiHanBao(ctx) for n := range eatNum { if n >= 10 { cancel() break } } fmt.Println("正在统计结果。。。") time.Sle原创 2020-07-15 13:35:27 · 164 阅读 · 0 评论 -
golang函数基础
package mainimport (“context”“fmt”“math/rand”“time”)import (“github.com/golang/glog”)var aa intfunc main() {aa = 12func() {defer func() {if err := recover(); err != nil {glog.Error(err)}}()aa =3}()fmt.Println(aa)}...原创 2020-07-15 13:25:29 · 149 阅读 · 0 评论 -
golang流量控制
package mainimport "time"import ( "github.com/golang/glog")func main() { //requests := make(chan int, 5) //for i := 1; i <= 5; i++ { // requests <- i //} //close(requests) // //limiter := time.Tick(200 * time.Millisecond) // //for re原创 2020-07-13 16:42:00 · 769 阅读 · 0 评论 -
context结束子go程
fmt.Println("main 函数 开始...") go func() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() fmt.Println("父 协程 开始...") go func(ctx context.Context) { for { for { select { case <-ctx.Done(): fmt.Println(原创 2020-07-03 19:21:53 · 330 阅读 · 0 评论 -
golang的Map读写锁
package mainimport ( "fmt" "sync" "time")type ConcurMap struct { Data map[string]int Lock *sync.RWMutex}func NewConcurMap() *ConcurMap{ return &ConcurMap{ Data: make(map[string]int), Lock:&sync.RWMutex{}, }}func (d ConcurMap)原创 2020-06-28 16:17:14 · 2949 阅读 · 0 评论 -
websocket下载
其实 golang 在 github 上建立了一个镜像库,如 https://github.com/golang/net 即是 https://golang.org/x/net 的镜像库获取 golang.org/x/net 包,其实只需要以下步骤:mkdir -p $GOPATH/src/golang.org/xcd $GOPATH/src/golang.org/xgit clone https://github.com/golang/net.git其它 golang.org/x 下的包获取皆原创 2020-06-25 23:49:13 · 1472 阅读 · 0 评论 -
websocket服务端与客户端
websocket服务端package mainimport ("golang.org/x/net/websocket""fmt""log""net/http")func echoHandler(ws *websocket.Conn) { msg := make([]byte, 512) n, err := ws.Read(msg) if err != nil { log.Fatal(err) } fmt.Printf("Receive: %s\n", msg[:n])原创 2020-06-21 01:08:18 · 298 阅读 · 1 评论