go
文章平均质量分 55
大叶子不小
这个作者很懒,什么都没留下…
展开
-
Golang 高效实践之defer、panic、recover实践
我们知道Golang处理异常是用error返回的方式,然后调用方根据error的值走不同的处理逻辑。但是,如果程序触发其他的严重异常,比如说数组越界,程序就要直接崩溃。Golang有没有一种异常捕获和恢复机制呢?这个就是本文要讲的panic和recover。其中recover要配合defer使用才能发挥出效果。文章介绍了defer、panic和recover的原理和用法,并且在最后给出了一些在实际应用的实践建议,不要滥用defer,注意defer搭配闭包时的一些特性。原创 2022-10-17 19:21:45 · 315 阅读 · 0 评论 -
Go 并发控制--WaitGroup的使用
开发过程中,经常遇到task之间的同步问题。例如,多个子task并发完成一部分任务,主task等待他们最后结束。在Go语言,实现同步的一种方式就是WaitGroup。Examplepackage main import ( "fmt" "sync" "time")func main() { var wg sync.WaitGroup wg.Add(3) go func(n int){ fmt.Println("n:", n) t := time.Dura原创 2022-02-10 16:24:53 · 231 阅读 · 0 评论 -
【Go学习笔记】 codis proxy处理流程
https://segmentfault.com/a/1190000017881541https://segmentfault.com/a/1190000017881541proxy启动cmd/proxy/main.go文件解析配置文件之后重点是proxy.New(config)函数该函数中,首先会创建一个Proxy结构体,如下:type Proxy struct { mu sync.Mutex ... config *Config router *R原创 2022-02-08 21:07:24 · 311 阅读 · 0 评论 -
go select 的default
当select中的其他条件分支都没有准备好的时候,`default` 分支会被执行。为了非阻塞的发送或者接收,可使用default分支:select {case i := <-c: // 使用 idefault: // 从 c 读取会阻塞}--------------------package mainimport ("fmt""time")func main() {tick := time.Tick(100 * time.Millise...原创 2022-01-25 16:48:17 · 2290 阅读 · 0 评论 -
go timer 计时器用法示例
计时器用来定时执行任务,分享一段代码:package main import "time"import "fmt" func main() {//新建计时器,两秒以后触发,go触发计时器的方法比较特别,就是在计时器的channel中发送值timer1 := time.NewTimer(time.Second * 2)//此处在等待channel中的信号,执行此段代码时会阻塞两秒<-timer1.Cfmt.Println("Timer 1 expired原创 2022-01-25 16:47:42 · 398 阅读 · 0 评论 -
golang源码分析:sarama kafka client(part II:消费者)
golang源码分析:sarama kafka client(part II:消费者) - 墨天轮这一讲,我们接着介绍下sarama kafka client的消费者的实现,先从例子开始:package mainimport ( "fmt" "log" "sync" "github.com/Shopify/sarama")// 消费者练习func main() { // 生成消费者 实例 consumer, err := sarama.NewC...原创 2021-12-28 21:08:39 · 2157 阅读 · 0 评论 -
golang源码分析:sarama kafka client(part III:client的角色)
golang源码分析:sarama kafka client(part III:client的角色) - 墨天轮理解client的角色对我们理解kafka和sarama非常有帮助。下面将一一详细介绍:我们用到了各种各样的client,返回的对象都是一个Broker的指针,本质上讲,我们通过kafka client 最终都是和broker通信,所以用Broker对象封装和kafka的连接,表示Client。不同场景下,Client有不同的角色,角色是通过元数据来确定的。fun...原创 2021-12-28 21:06:37 · 1104 阅读 · 0 评论 -
https://www.modb.pro/db/129998
golang源码分析:sarama kafka client(part I:生产者) - 墨天轮https://github.com/Shopify/sarama 是一个纯go实现的kafka客户端,是gopher学习kafka一个很好的资料。说实话sarama的代码组织很烂,密密麻麻一堆源码文件都在一个目录,让人无从下手,下面列出了一部分:examplesmockstools //基于客户端,实现的kafka客户端工具 tools/kafka-producer-performance原创 2021-12-28 20:59:51 · 1497 阅读 · 0 评论 -
Go 计算程序运行时间
1.计算代码块的运行时间start := time.Now()//some func or operationcost := time.Since(start)fmt.Printf("cost=[%s]",cost)其中time.Since()函数返回字符串类型,例如1h2m3s等,可能还有us等2.计算函数的运行时间func compute() { start := time.Now() defer func() { cost := time.Sin原创 2021-08-20 10:05:30 · 1982 阅读 · 2 评论 -
golang filepath.Walk遍历指定目录下的所有文件
package mainimport ( "fmt" "os" "path/filepath")func walkFunc(path string, info os.FileInfo, err error) error { fmt.Printf("%s\n", path) return nil}func main() { //遍历打印所有的文件名 filepath.Walk("C:/Documents and Settings/xxx/...原创 2021-07-22 16:20:12 · 4088 阅读 · 0 评论 -
go语言中fallthrough用法
switch sExpr {case expr1: some instructionscase expr2: some other instructionscase expr3: some other instructionsdefault: other code}sExpr和expr1、expr2、expr3的类型必须一致。Go的switch非常灵活,表达式不必是常量或整数,执行的过程从上至下,直到找到匹配项;而如果switch没有表达式,它会匹配true。 G...原创 2021-05-31 14:42:23 · 534 阅读 · 2 评论 -
go语言字符串的处理与json转换
1 字符串的处理 可以通过Go标准库中的strings和strconv两个包中的函数进行相应的操作1 字符串的操作1 func Contains(s, substr string) bool2 字符串s中是否包含substr,返回bool值package mainimport ( "fmt" "strings")//1 func Contains(s, substr string) bool//字符串s中是否包含substr,返回bool值func m原创 2021-05-17 21:23:55 · 1894 阅读 · 0 评论 -
go-zookeeper客户端可选参数配置
go-zookeeper有3个比较常用的可选参数,分别控制日志输出和事件回调://是否输出日志func WithLogInfo(logInfo bool) connOption//定制日志输出func WithLogger(logger Logger) connOption//事件回调func WithEventCallback(cb EventCallback) connOption示例:package mainimport ( "github.com/sa...原创 2021-05-17 20:11:13 · 274 阅读 · 0 评论 -
golang中的字符串拼接
go语言中支持的字符串拼接的方法有很多种,这里就来罗列一下常用的字符串拼接方法1.最常用的方法肯定是 +连接两个字符串。这与python类似,不过由于golang中的字符串是不可变的类型,因此用 +连接会产生一个新的字符串对效率有影响。s1 := "字符串"s2 := "拼接"s3 := s1 + s2fmt.Print(s3) //s3 = "打印字符串"2.第二种方法使用sprintf函数,虽然不会像直接使用 +那样产生临时字符串。但是效率也不高s1 := "...原创 2021-05-13 16:51:48 · 303 阅读 · 0 评论 -
golang 访问 BasicAuth 认证的 http
import ( "net/http" "strings" urlpkg "net/url")url := "http://jenkins/job/test/buildWithParameters"data := urlpkg.Values{}data.Add("SERVER_NAME", "测试服")data.Add("SERVER_URI", "refs/heads/master")data.Add("CONFIG_URI", "refs/heads/master.原创 2021-05-13 16:51:08 · 3363 阅读 · 0 评论 -
GoLand:设置gofmt与goimports,保存时自动格式化代码
GoLand也支持在保存代码时,自动调用gofmt和goimports来自动格式化代码。在最新版的GoLand(2019.3)中,是通过File Watchers插件来实现此功能的。在此介绍一下GoLand中如何设置:首先,得保证安装了一个叫做”File Watchers”的插件,并设置为启用状态:然后,直接在Tools -> File Watchers中,添加如下设置:————————————————版权声明:本文为CSDN博主「琦彦」的原创文章,遵循CC 4.0...原创 2021-05-13 16:28:26 · 1425 阅读 · 0 评论 -
golang获取当前时间、时间戳和时间字符串及它们之间的相互转换
1、获取当前时间(1)currentTime:=time.Now()//获取当前时间,类型是Go的时间类型Time(2)t1:=time.Now().Year()//年t2:=time.Now().Month()//月t3:=time.Now().Day()//日t4:=time.Now().Hour()//小时t5:=time.Now().M...原创 2021-05-10 14:29:11 · 946 阅读 · 0 评论 -
golang中的字符串拼接
go语言中支持的字符串拼接的方法有很多种,这里就来罗列一下常用的字符串拼接方法1.最常用的方法肯定是 +连接两个字符串。这与python类似,不过由于golang中的字符串是不可变的类型,因此用 +连接会产生一个新的字符串对效率有影响。s1 := "字符串"s2 := "拼接"s3 := s1 + s2fmt.Print(s3) //s3 = "打印字符串"2.第二种方法使用sprintf函数,虽然不会像直接使用 +那样产生临时字符串。但是效率也不高s1 := "...原创 2021-05-10 14:24:31 · 1110 阅读 · 8 评论 -
Golang RPC
RPC前面几个小节我们介绍了如何基于Socket和HTTP来编写网络应用,通过学习我们了解了Socket和HTTP采用的是类似"信息交换"模式,即客户端发送一条信息到服务端,然后(一般来说)服务器端都会返回一定的信息以表示响应。客户端和服务端之间约定了交互信息的格式,以便双方都能够解析交互所产生的信息。但是很多独立的应用并没有采用这种模式,而是采用类似常规的函数调用的方式来完成想要的功能。RPC就是想实现函数调用模式的网络化。客户端就像调用本地函数一样,然后客户端把这些参数打包之后通过网络传递到服务原创 2021-03-09 15:24:44 · 263 阅读 · 0 评论 -
Go语言调度的MPG模型
在了解Go的运行时的scheduler之前,需要先了解为什么需要它,因为我们可能会想,OS内核不是已经有一个线程scheduler了嘛?熟悉POSIX API的人都知道,POSIX的方案在很大程度上是对Unix process进场模型的一个逻辑描述和扩展,两者有很多相似的地方。 Thread有自己的信号掩码,CPU affinity等。但是很多特征对于Go程序来说都是累赘。 尤其是context上下文切换的耗时。另一个原因是Go的垃圾回收需要所有的goroutine停止,使得内存在一个一致的状态。垃圾回收原创 2021-03-09 11:48:51 · 234 阅读 · 0 评论 -
Go中json.Unmarshal对数字类型的处理
JSON的规范中,对于数字类型,并不区分是整型还是浮点型。对于如下JSON文本:{ "name": "ethancai", "fansCount": 9223372036854775807}如果反序列化的时候指定明确的结构体和变量类型package mainimport ( "encoding/json" "fmt")type User struct { Name string FansCount int64}原创 2021-02-27 15:01:52 · 2998 阅读 · 0 评论 -
Go 函数选项模式
Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱即用, 并且你偶尔可能需要提供一些更详细的配置.在很多语言中这很容易; 在 C 族语言中, 可以使用不同数量的参数提供相同函数的多个版本; 在像 PHP 这样的语言中, 可以给参数一个默认值,并在调用方法时忽略它们. 但是在 Golang 中, 这两种方式你哪个也用不了. 那么你如何创建一个函数, 用户可以指定一些额外的配置?有很多可能的方法可以做到这一点, 但原创 2021-02-27 14:34:45 · 205 阅读 · 0 评论 -
Golang中map的安全使用
简单介绍map数据类型在很多语言中都有,是一个key,value形式的hash表,从而将key,value进行一一映射,进行快速查找、添加、删除等操作。在Go语言中也不例外,提供了map数据结构类型。内建map切忌开箱即用Golang中,map是引用类型,如指针切片一样,通过下面的代码声明后指向的是nil。这点在golang官方文档中也说明了,所以千万别直接声明后就使用,开始可能经常会犯下面的错:var m map[string]stringm["result"] = "result"原创 2021-02-27 11:47:07 · 533 阅读 · 0 评论 -
Channel 是可以控制读写权限
go func(c chan int) { //读写均可的channel c } (a)go func(c <- chan int) { //只读的Channel } (a)go func(c chan <- int) { //只写的Channel } (a)package mainimport ( "fmt" "time")func main() { c := make(chan int, 10) go fibo..原创 2021-02-27 11:11:46 · 232 阅读 · 0 评论 -
error
fmt.Println 打印结构体的时候,会把其中的 error 的返回的信息打印出来。type User struct { username string password string}func (p *User) init(username string ,password string) (*User,string) { if ""==username || ""==password { return p,p.Error() } p.user.原创 2021-02-27 10:32:57 · 473 阅读 · 0 评论 -
go的且切片append后的len和cap的变化
https://www.runoob.com/go/go-slice.html这个是我看的最简洁清晰也和实际符合的,还没有看到原理部分关于 cap 为何变为 6 的问题,我认为楼上解释也不对,哈哈。1、当同时添加多个元素时:len(list)+len([params]) 为偶数:cap=len(list)+len([params])len(list)+len([params]) 为奇数:cap=len(list)+len([params])+1即 cap 始终为偶数。2、当一个原创 2021-02-26 16:11:39 · 549 阅读 · 2 评论 -
Go 切片Slice的长度len与容量cap
切片拥有长度和容量。切片的长度是它所包含的元素个数。切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。切片 s 的长度和容量可通过表达式 len(s) 和 cap(s) 来获取。这篇写的不错:https://sunzhy.blog.csdn.net/article/details/88770501...原创 2021-02-26 10:01:45 · 725 阅读 · 0 评论 -
go的值传递和引用传递
package mainimport "fmt"type Books struct { title string author string subject string book_id int}func changeBook(book Books) { book.title = "book1_change"}func main() { var book1 Books book1.title = "book1" book1.原创 2021-02-25 16:39:14 · 225 阅读 · 0 评论 -
go局部变量反人类的操作
package mainimport "fmt"func main(){ var a int = 0 fmt.Println("for start") for a:=0; a < 10; a++ { fmt.Println(a) } fmt.Println("for end") fmt.Println(a)}输出为:for start0123456789for end0在 for 循环的 initialize(a:=0.原创 2021-02-25 15:13:12 · 433 阅读 · 2 评论 -
go 的fmt的对比说明
package mainimport "fmt"func main() { var a int = 4 var ptr *int ptr = &a println("a的值为", a); // 4 println("*ptr为", *ptr); // 4 println("ptr为", ptr); // 824633794744 ss := fmt.Sprintf("类型是:%T", a) //S表示只是格式化不输出 fmt.Println(ss) .原创 2021-02-25 11:38:14 · 156 阅读 · 0 评论 -
golang中,unsafe.sizeof到底是干嘛的?
小生初学Go,有一点不懂,今天为了知道空结构体到底占多大的空间的时候,去百度说用unsafe.sizeof,但是对于unsafe.sizeof好像和其它语言的sizeof有些不一样?比如:var str string = "hello"var str2 stringfmt.Println(unsafe.SizeOf(str), unsafe.SizeOf(str2))结构两个打印出来都是16,这是为啥?到底怎样来获取结构体占的空间大小?空结构体占多大的空间?共 1 个回复.原创 2021-02-25 10:39:59 · 859 阅读 · 0 评论 -
Go内存分配机制-TCMalloc
本文是《循序渐进go语言》第四篇-Go内存分配机制。golang的内存采用了TCMalloc 这种分配机制。go是在多种语言诞生N多年之后,才由几个大神开发的。每种语言都有自己的内存分配机制,那么作为后起之秀,go为什么选用TCMalloc呢?因为TCMalloc(Thread-Cache Malloc) 在内存分配上性能做的更好,而且对内存的利用率也有所提高。先简单说一下TCMalloc在这两方面是如何做到的?性能提升主要从两点来看,第一点线程内部小对象的使用不存在锁竞争,减少了竞争带...原创 2021-02-23 19:40:09 · 609 阅读 · 0 评论 -
如何深入浅出地解释并发模型中的 CSP 模型?
作者:匿名用户链接:https://www.zhihu.com/question/26192499/answer/46345499来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。好像没什么人回答,因为Node.js的缘故导致我在业余时对消息传递系统很感兴趣,所以抛砖引玉,先来简单谈谈Actor和CSP以及它们的区别?CSP(Communicating Sequential Process)模型和Actor模型是两门非常复古且外形接近的并发模型。但CSP与Act.原创 2021-02-23 19:14:03 · 1000 阅读 · 0 评论 -
Go 定时器NewTimer、NewTicker 和time.After
1、定时器(time.NewTimer)Go语言的定时器实质是单向通道,time.Timer结构体类型中有一个time.Time类型的单向chan,源码(src/time/time.go)如下type Timer struct { C <-chan Time r runtimeTimer}初始化 Timer 方法为NewTimer示例package mainimport ( "fmt" "time")func main() { t := t原创 2021-02-23 18:50:12 · 1669 阅读 · 0 评论 -
理解go的function types
今天看Martini文档,其功能列表提到完全兼容http.HandlerFunc接口,就去查阅了Go: net/http的文档,看到type HandlerFunc这部分,顿时蒙圈了。由于之前学习的时候没有关注过function types的知识点,就Google了一些文章,才算是有了个大概的了解。从golang的官方文档得知function types的解释是这样的。A function type denotes the set of all functions with the same pa原创 2021-02-23 16:52:52 · 230 阅读 · 0 评论 -
golang substring方法的几种实现
1.原生方法,直接使用slice切片实现,但此方法对于包括中文字符就截取错误s:="abcde"fmt.Println(s[0:2]);//输出//ab//包含中文的字符串s2 := "我是中国人"fmt.Println(s2[0:2])//输出// ��//有乱码呀2.如下是我实现的几种方法,最主要还是通过rune来实现的//获取source的子串,如果start小于0或者end大于source长度则返回""//start:开始index,从0开始,包括0/.原创 2021-02-22 20:42:48 · 1690 阅读 · 0 评论 -
golang的SHA1withRSA的实现
java 采用的SHA1withRSAGoogle好久也没找到go的解决方案,查到某位大神说SHA1withRSA 是JAVA特有的封装,是先进行一个SHA1的散列,再进行一次RSA的加密,使用SHA散列包。这会产生一个小的32字节哈希字符串,便于快速计算 使用您的私钥对该字符串进行签名golang解决##参考资料##大神解决代码func main() { block, _ := pem.Decode([]byte(`-----BEGIN RSA PRIVATE KEY.原创 2021-02-20 17:44:42 · 1005 阅读 · 2 评论 -
golang中实现RSA(PKCS#1)加密解密
RSA非对称加密算法,基于PKCS#1规范, 我们在使用RSA的时候需要提供 公钥和私钥 , 我们可以通过openss来为我们生成对应的pem格式的公钥和私钥匙。关于pkcs相关标准如下,摘自百度:PKCS#1:定义RSA公开密钥算法加密和签名机制,主要用于组织PKCS#7中所描述的数字签名和数字信封[22]。PKCS#3:定义Diffie-Hellman密钥交换协议[23]。PKCS#5:描述一种利用从口令派生出来的安全密钥加密字符串的方法。使用MD2或MD5 从口令中派生密钥..原创 2021-02-20 14:32:47 · 869 阅读 · 0 评论 -
openssl提取pfx证书密钥对
刚做银联的项目,对方给了1.pfx和1.cer两个测试文件,总结一下利用这两个文件提取出文本银联提供两个测试证书 1.pfx 和 1.cer .其中 pfx证书包含RSA的公钥和密钥;cer证书用于提取pfx证书中密钥时允许当前电脑进行合法操作。提取步骤如下:1. 点击1.cer,安装cer证书2.从pfx提取密钥信息,并转换为key格式(pfx使用pkcs12模式补足) (1)提取密钥对 openssl pkcs12 -in 1.pfx -nocert...原创 2021-02-20 14:31:53 · 870 阅读 · 0 评论 -
golang 前置补0
package main import ( "fmt") func main() { a := 1 fmt.Println(a) //前置补0 fmt.Printf("%03d", a) fmt.Println("") fmt.Printf("%0*d", 3, a)}和java基本一样原创 2021-02-19 17:01:22 · 1769 阅读 · 0 评论