Go语言
Go语言
BasicLab基础架构实验室
本人深耕基础架构领域,曾在国内500强大厂研发企业级百亿量级吞吐中间件,擅长Java语言、Go语言、Python语言、C语言、NodeJS、Web、Linux、深度学习、大数据、云原生等
展开
-
Go 报错 Package libzmq was not found in the pkg-config search path.
【代码】Go 报错 Package libzmq was not found in the pkg-config search path.原创 2023-09-08 17:11:36 · 315 阅读 · 0 评论 -
Go 报错 pkg-config: exec: “pkg-config“: executable file not found in $PATH
安装pkg-config。原创 2023-09-08 17:10:44 · 661 阅读 · 0 评论 -
Go 报错 error obtaining VCS status: exit status 128 Use -buildvcs=false to disable VCS stamping
语言时,遇到如上的报错,根据提示应该是要在启动的时候指定参数。,所以应该按照如下步骤进行配置后启动运行。,但是由于本人使用的是。原创 2023-09-08 17:08:50 · 830 阅读 · 0 评论 -
Go语言Log日志文件打印(fileLogger)
最近项目中使用到 Log 日志文件打印的方式,主要是使用的 fileLogger 来封装的库,fileLogger是一个基于 Go 开发的可自动分割文件进行备份的异步日志库,具有以下特点:日志文件可按文件大小进行备份,可定制文件大小和数量 日志文件可按日期进行备份 两种使用模式: 不同类型log分别写入不同的文件,使用Print(),Printf(),Println()三个方法 不同类型log写入一个文件,但不同LEVEL的日志具有不同的颜色,使用T(),I(),W(),E()...原创 2021-11-05 21:17:25 · 2662 阅读 · 0 评论 -
Go语言Channel实现消息的批量处理
话说,有这样一个场景,就是客户送不断发送消息,需要服务端异步处理。一个一个的处理未免有些浪费资源,更好的方法是批量处理。当消息量特别大时,使用kafka之类的message queue自然是首选,但更多的时候,我们想用更加轻量的方案来解决这个问题。下面来详细分析一下技术需求,这个方案需要实现以下几点:消息聚合后处理(最大条数为BatchSize) 延迟处理(延迟时间为LingerTime) 自定义错误处理 并发处理...原创 2021-11-05 20:57:14 · 1556 阅读 · 0 评论 -
Go语言Select实现原理
一、select简介1、Go的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的;当select中没有case语句的时候,会阻塞当前groutine。2、select是Golang在语言层面提供的I/O多路复用的机制,其专门用来检测多个channel是否准备完毕:可读或可写。3、select语句中除default外,每个case操作一个channel,要么读要么写4、select语句中除d...原创 2021-11-04 17:46:41 · 3441 阅读 · 0 评论 -
Go语言定时器与Select的使用方式
1、Timer(只执行一次)package mainimport ( "fmt" "time")func main() { //只执行一次 则关闭 2秒之后执行 timer1 := time.NewTimer(2 * time.Second) t1 := time.Now() fmt.Printf("t1:%v\n", t1) t2 := <-timer1.C fmt.Printf("t2:%v\n", t2) //2.验证timer只能响应1次 ...原创 2021-11-04 17:25:16 · 1802 阅读 · 0 评论 -
Go语言标准库Time
time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。type Duration int64const ( Nanosecond Duration = 1 Microsecond = 1000 * Nanosecond Millisecond = 1000 * Microsecond Second = 1000 * Millisecond Minute ...原创 2021-11-04 16:23:22 · 483 阅读 · 0 评论 -
Go语言操作Zookeeper
最近工作中有使用到通过Go语言操作Zookeeper相关内容,工程使用的是 go-zookeeper 来做的,特此记录便于日后查阅。go-zookeeper:文档地址:zk package - github.com/samuel/go-zookeeper/zk - pkg.go.dev 1、连接zk serverpackage mainimport ( "fmt" "github.com/samuel/go-zookeeper/zk" ...原创 2021-11-04 16:06:31 · 1753 阅读 · 5 评论 -
Go语言操作Redis
最近工作中有使用到通过Go语言操作Redis相关内容,特此记录便于日后查阅。1、获取Golang的redis第三方api $ git clone https://github.com/garyburd/redigo.git2、获取redis连接 & Set/Get接口package mainimport ( "fmt" "github.com/garyburd/redigo/redis" // 引入redis包)...原创 2021-11-04 15:54:57 · 1384 阅读 · 0 评论 -
GO语言操作Kafka
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能、持久化、多副本备份、横向扩展等特点。本文介绍了如何使用Go语言发送和接收kafka消息。Go语言中连接kafka使用第三方库:github.com/Shopify/sarama 1、下载及安装 $ go get github.com/Shopify/sarama 注意:saramav1.20之后的版本加入了zstd压缩算...原创 2021-11-04 15:43:41 · 6599 阅读 · 0 评论 -
GO语言操作MySQL
最近工作中有使用到通过Go语言创建MySQL数据库连接的内容,特此记录便于日后查阅。 1、定义数据库结构体type DBConfig struct { Dsn string `json:"dsn"` MaxIdle int `json:"maxIdle"`} 2、数据库工具package dbimport ( "context" "database/sql" "sync" "time" _ "github...原创 2021-11-04 15:21:58 · 387 阅读 · 0 评论 -
Go语言变量的定义
Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性。声明变量的一般形式是使用 var 关键字:var name type其中,var 是声明变量的关键字,name 是变量名,type 是变量的类型。需要注意的是,Go语言和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后。这样做的好处就是可以避免像C语言中那样含糊不清的声明形式,例如:int* a, b; 。其中只有...原创 2021-11-04 15:03:19 · 2237 阅读 · 0 评论 -
Go设计模式—原型模式
这个模式在 Java、C++ 这种面向对象的语言不太常用,但是如果大家使用过 javascript 的话就会非常熟悉了,因为 js 本身是基于原型的面向对象语言,所以原型模式在 js 中应用非常广泛。 接下来会按照一个类似课程中的例子使用深拷贝和浅拷贝结合的方式进行实现 需求: 假设现在数据库中有大量数据,包含了关键词,关键词被搜索的次数等信息,模块 A 为了业务需要 会在启动时加载这部分数据到内存中 并且需要定时更新里面的数据 同时展示给用户的数据每次必须要是相同版本的数据,不能一部分数据来原创 2021-11-04 14:53:23 · 536 阅读 · 0 评论 -
Go设计模式—工厂模式
由于 Go 本身是没有构造函数的,一般而言我们采用NewName的方式创建对象/接口,当它返回的是接口的时候,其实就是简单工厂模式 1、简单工厂package factory// IRuleConfigParser IRuleConfigParsertype IRuleConfigParser interface { Parse(data []byte)}// jsonRuleConfigParser jsonRuleConfigParsert...原创 2021-11-04 14:49:06 · 746 阅读 · 2 评论 -
Go设计模式—单例模式
单例模式采用了 饿汉式 和 懒汉式 两种实现,个人其实更倾向于饿汉式的实现,简单,并且可以将问题及早暴露,懒汉式虽然支持延迟加载,但是这只是把冷启动时间放到了第一次使用的时候,并没有本质上解决问题,并且为了实现懒汉式还不可避免的需要加锁。 1、饿汉式package singleton// Singleton 饿汉式单例type Singleton struct{}var singleton *Singletonfunc init(...原创 2021-11-04 14:41:53 · 569 阅读 · 0 评论 -
Go语言Flag.String获取程序启动参数
有时候我们的程序启动时会需要带一些参数,这个时候怎么golang自带的flag.string来解析参数参数 功能 name 命令行参数名称,比如 -b, -help value 默认值,未显式指定的参数,给出隐式的默认值,比如本例中-b未给出的话,*b=false usage 提示信息,如果给出的参数不正确或者需要查看帮助 -help,那么会给出这里指定的字符串 flag使用前,必须首先解析:flag.Parse(),代码如下:...原创 2021-11-04 11:19:14 · 3640 阅读 · 0 评论 -
Go语言Signal.Notify信号量的使用(优雅关闭进程资源)
go中的信号量:信号 值 动作 说明 SIGHUP 1 Term 终端控制进程结束(终端连接断开) SIGINT 2 Term 用户发送INTR字符(Ctrl+C)触发 SIGQUIT 3 Core 用户发送QUIT字符(Ctrl+/)触发 SIGILL 4 Core 非法指令(程序错误、试图执行数据段、栈溢出等) SIGABRT 6 Core 调用abort函...原创 2021-11-04 10:41:16 · 4167 阅读 · 0 评论 -
Go语言Marshal序列化和反序列化
最近项目中有看到使用Marshal,大概查了一下是做 Json 序列化和反序列化的,特此记录便于日后查阅。package main import ( "fmt" "encoding/json") func test1(){ m := map[string]interface{} {"name":"taoge", "age":30, "addr":"China"} fmt.Println(m) data, _ := json.Mar...原创 2021-11-04 10:13:51 · 2179 阅读 · 0 评论 -
Go语言值接收者方法和指针接收者方法
在Go语言中方法就是定义了接受者的函数,方法和函数只差了一个参数,那就是方法在func和标识符之间多了一个参数。接受者定义在func关键字和函数名之间:type Person struct { name string age int}func (p Person) say() { fmt.Printf("I'm %s,%d years old\n",p.name,p.age)}接收者有两种,一种是值接收者,一种是指针接收者。顾名思...原创 2021-11-02 14:51:02 · 1205 阅读 · 1 评论 -
Go语言列表List获取元素
Golang的列表元素的获取可以使用内置的 Front 函数获取头结点,使用 Back 函数获取尾结点,使用 Prev 获取前一个结点,使用 Next 获取下一个结点。 1、获取列表头结点Front() *Elementpackage mainimport ( "container/list" "fmt")func main() { fmt.Println("嗨客网(www.haicoder.net)") //使用列表内置的 Front() 函数,...原创 2021-11-02 11:49:46 · 1880 阅读 · 0 评论 -
Go语言Defer(延迟执行语句)
Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。关键字 defer 的用法类似于面向对象编程语言Java和C#的 finally 语句块,它一般用于释放某些已分配的资源,典型的例子就是对一个互斥解锁,或者关闭一个文件。多个延迟执行语句的处理顺序...原创 2021-11-02 11:07:31 · 206 阅读 · 0 评论 -
Go语言Append函数的使用
1、append函数的使用作用:在原切片的末尾添加元素示例:package main //必须有个main包 import "fmt" func main() { s1 := []int{} fmt.Printf("len = %d, cap = %d\n", len(s1), cap(s1)) fmt.Println("s1 = ", s1) //在原切片的末尾添加元素 s1 = appe...原创 2021-11-02 10:15:43 · 11638 阅读 · 1 评论 -
Go 实现线程安全Map读写(sync.RWMutex)
当然,go 语言已经内置提供了线程安全 map,即 sync.Map,在这里只是用自己的方式实现简单的锁应用,代码示例如下:import "sync" type SafeDict struct { data map[string]int *sync.RWMutex} func NewSafeDict(data map[string]int) *SafeDict { return &SafeDict{data, &...原创 2021-11-02 09:47:13 · 1085 阅读 · 0 评论