go
文章平均质量分 50
王建文
这个作者很懒,什么都没留下…
展开
-
grpc 重试机制
这也是grpc官方库里的示例代码,其他讲retry重试的基本也都是参照这种方法。但是本地配置之后没生效。换用下边第二种方式之后问题解决。参照下边连接里的示例代码,先在opts里配置重试规则,然后grpc.Dial方法里应用这个规则就可以。相对官方的方法这里的方法配置起来比较简单,而且配置完实验马上就生效了。原创 2023-11-10 12:40:36 · 427 阅读 · 0 评论 -
golang 替换引用包的域名
背景,公司的gitlab切换了部署的服务器,以及域名。因此项目中使用gitlab域名的地方全部需要替换成新域名。原创 2022-10-27 09:58:35 · 1226 阅读 · 0 评论 -
golang导入私有仓库报错:“server response: not found:xxx: invalid version: git ls-remote -q origin in xxx“
1.go get导入私有仓库报错➜ go get "devops.gitlab.xxx.com/xxx/xxx"go: devops.gitlab.zfkunyu.com/cartsee-go/[email protected]: verifying go.mod: devops.gitlab.zfkunyu.com/cartsee-go/[email protected]/go.mod: reading https://goproxy.cn/sumdb/sum.golang.org/looku原创 2022-04-30 14:21:56 · 7535 阅读 · 3 评论 -
golang mongo-driver 模糊查询
1.使用mongo的正则匹配实现官方文档如下:https://docs.mongodb.com/manual/reference/operator/query/regex/#pcre-vs-javascript2.针对mong-dirver的fiter结构mongo-driver包“go.mongodb.org/mongo-driver/bson/primitive”// 其中key替换成要模糊查询的字段名,value替换成输入的要模糊查询的字符串。然后把filter传入查询函数即可// op原创 2022-02-24 12:46:19 · 1538 阅读 · 0 评论 -
mac goland 常用快捷键
1.批量修改变量名shift+F6键盘没有F6时 shift+fn+F62.操作记录回退或者前进比如有时候代码多次跳转之后,想一步一步回到上一次的位置。command+option+←/→3.查询与替换查询:command+F替换:command+R全局查询:command+shift+F全局替换:command+shift+R...原创 2022-02-10 13:08:59 · 2758 阅读 · 0 评论 -
golang 10大排序算法
1. 快速排序思路和算法快速排序的主要思想是通过划分将待排序的序列分成前后两部分,其中前一部分的数据都比后一部分的数据要小,然后再递归调用函数对两部分的序列分别进行快速排序,以此使整个序列达到有序。快排模板1:func quick_sort(nums []int, l, r int) { if l >= r { return } rand.Seed(time.Now().Unix()) p := rand.Intn(r-l+1) + l nums[r], nums[p] =原创 2021-09-28 12:42:58 · 2443 阅读 · 1 评论 -
goroutine与线程的区别
1、goroutine简介Goroutine是建立在线程之上的轻量级的抽象。它允许我们以非常低的代价在同一个地址空间中并行地执行多个函数或者方法。相比于线程,它的创建和销毁的代价要小很多,并且它的调度是独立于线程的。在golang中创建一个goroutine非常简单,使用“go”关键字即可:示例:package mainimport ( "fmt" "time")func learning() { fmt.Println("My first goroutine")}func ma原创 2021-08-07 13:54:54 · 925 阅读 · 0 评论 -
2021golang面试题
1.golang GC原创 2021-08-07 13:32:46 · 700 阅读 · 1 评论 -
golang中锁的使用
Go中锁分为两种:互斥锁读写锁1、互斥锁并发程序对公共资源访问的限制最常见的就是使用互斥锁的方式。在Go中,sync.Mutex 提供了互斥锁的实现。package mainimport ( "fmt" "sync")var wg sync.WaitGroupvar l sync.Mutexfunc main() { var counter int for i := 0; i < 1000; i++ { wg.Add(1) go func() { l原创 2021-08-07 09:54:48 · 1120 阅读 · 0 评论 -
常见的并发模式
1、生产者消费者模型并发编程中最常见的例子就是生产者消费者模式,该模式主要通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。简单地说,就是生产者生产一些数据,然后放到成果队列中,同时消费者从成果队列中来取这些数据。这样就让生产消费变成了异步的两个过程。当成果队列中没有数据时,消费者就进入饥饿的等待中;而当成果队列中数据已满时,生产者则面临因产品挤压导致CPU被剥夺的下岗问题。Go语言实现生产者消费者并发简单案例:// 生产者: 生成 factor 整数倍的序列func Produc原创 2021-08-01 21:01:59 · 728 阅读 · 0 评论 -
golang并发模型GMP
1、并发与并行并行:其实很好理解,就是同时执行的意思,在某一时间点能够执行多个任务。最简单的方式就是借助多线程或多进程,这样才可在同一时刻执行多个任务。单线程是永远无法达到并行状态的。并发:是在某一时间段内可以同时处理多个任务。它允许多个任务同时执行,这个同时指的就是一段时间内。单线程中多个任务以间隔执行实现并发。总结:多线程或多进程是并行的基础,但单线程也通过协程实现了并发。go通过协程实现并发,协程间靠chan通信。...原创 2021-08-01 19:33:44 · 359 阅读 · 0 评论 -
golang垃圾回收(GC)
GC全称Garbage Collection1、常见垃圾回收算法目前比较常见的垃圾回收算法有三种:引用计数:为每个对象维护一个引用计数,当引用该对象的对象销毁时,引用计数 -1,当对象引用计数为 0 时回收该对象。代表语言:Python、PHP、Swift优点:对象回收快,不会出现内存耗尽或达到某个阈值时才回收。缺点:不能很好的处理循环引用,而实时维护引用计数也是有损耗的。标记-清除:从根变量开始遍历所有引用的对象,标记引用的对象,没有被标记的进行回收。代表语言:Golang(原创 2021-07-28 10:30:33 · 1090 阅读 · 0 评论 -
golang信号处理及优雅退出
每个平台的信号定义或许有些不同。下面列出了POSIX中定义的信号。 Linux 使用34-64信号用作实时系统中。 命令man 7 signal提供了官方的信号介绍。在POSIX.1-1990标准中定义的信号列表在SUSv2和POSIX.1-2001标准中的信号列表:kill pid 与 kill -9 pid的区别kill pid的作用是向进程号为pid的进程发送SIGTERM(这是kill默认发送的信号),该信号是一个结束进程的信号且可以被应用程序捕获。若应用程序没有捕获并响应该信号的逻原创 2021-07-01 16:14:41 · 1171 阅读 · 0 评论 -
golang map并发读写:“fatal error: concurrent map writes”
原因go中的map不是并发安全的,所以当多个goroutine同时对map执行写操作的时候,就会报刚刚的错误。解决方案1.加锁var ( someMap = map[string]string{} someMapMutex = sync.RWMutex{})go func() { someMapMutex.Lock() someMap["key"] = "value" someMapMutex.Unlock()}()someMapMute原创 2021-07-01 15:54:27 · 1352 阅读 · 0 评论 -
golang gin Model binding and validation
gin使用go-playground/validator.v8进行validation。tag的具体使用参考下边链接:包括常用的required、gt、max、min等的详细介绍tag详细介绍原创 2021-01-19 15:03:24 · 475 阅读 · 0 评论 -
golang int slice convert to string
需求:把一个int切片数据转化成字符串,以指定的分隔符分隔。具体实现方案如下边示例里的intSliceToString方法:package mainimport ( "fmt" "strings")func main() { intSlice := []int32{1, 2, 3} strSlice := intSliceToString(intSlice, ",") fmt.Println("strSlice:", strSlice)}// 下述方法里边的3行代码,任意一行都原创 2021-01-12 17:32:20 · 2580 阅读 · 0 评论 -
golang securecookie加密解密cookie值
github地址:https://github.com/gorilla/securecookie1.创建一个securecookie实例// Hash keys should be at least 32 bytes longvar hashKey = []byte("very-secret")// Block keys should be 16 bytes (AES-128) or 32 bytes (AES-256) long.// Shorter keys may weaken the e原创 2020-12-24 12:55:41 · 689 阅读 · 0 评论 -
protobuf import功能:导入同文件夹下以及不同文件夹下的proto文件
一般是为了利用另外一个proto文件里定义的结构,避免重复定义。1.导入同文件夹下proto文件如下图所示:①导入需要用到结构体所在的proto文件,下边是test.proto文件中导入了"new.proto",以便于直接使用"new.proto"中定义好的Variant结构。②直接用Variant作为类型名。生成的pb.go文件2.导入不同文件夹下proto文件可参考下边两篇文章①protobuf 导入另一文件夹下的proto②Protobuf 的 import 功能在 Go 项目原创 2020-12-11 00:23:54 · 14277 阅读 · 6 评论 -
如何在Golang中正确序列化JSON字符串
1.Json.Marshal会有什么问题?下边示例是将json序列化成bytes,然后把bytes反序列化到匹配的结构体。package mainimport ( "encoding/json" "fmt")type Person struct { FirstName string `json:"firstName"` LastName string `json:"lastName"`}func main() { in := `{"firstName":"John","las翻译 2020-11-12 16:45:00 · 2140 阅读 · 0 评论 -
golang错误处理之panic
panic,类似其他语言throw抛出异常一样,通过函数调用链,一层层的把异常往上抛出去,如果没有人拦截异常,就会退出程序。一、直接panicpanic后直接抛出异常,程序终止,后续操作都不会执行package mainimport "fmt"// 直接panic,panic后直接抛出异常,程序终止,后续操作都不会执行func PanicTest() { fmt.Println("a") panic("panic 错误") fmt.Println("b")}func main()原创 2020-10-30 10:03:20 · 897 阅读 · 0 评论 -
goroutine channel应用select语句
select语句可以用来等待多个channel,直到其中一个channel可以读取到数据或者写入数据成功。示例:package mainimport "fmt"// 计算数列func fibonacci(c, quit chan int) { x, y := 0, 1 // 开始一个死循环 for { // 通过select等待通道c和quit,看那个有反应,就执行对应的case语句中的代码 select { case c <- x: // 如果通道c写入数据成功原创 2020-10-29 18:56:40 · 253 阅读 · 0 评论 -
go 缓冲channel示例
一、缓冲channel创建// 给make函数,传递第2个参数,指定缓冲队列大小ch := make(chan int, 100)缓冲channel的使用方式跟无缓冲channel一样,区别就是往channel写输入数据的时候,如果缓存队列还没满,是不会阻塞写操作,例如:上面创建了的channel缓冲队列大小是100,如果写入到channel中,还未被取走的数据大于100,就会阻塞写操作。二、缓冲channel应用示例1.示例1package mainimport ( "fmt")原创 2020-10-29 18:48:03 · 635 阅读 · 0 评论 -
golang 上传图片到aws s3 bucket
一、创建aws账户,以及s3 bucket首先,创建一个aws账户,可以在这里创建。创建账户后,进入控制台,在storage分类中选择s3 服务。在s3控制台,创建一个新的bucket,命名友好一些,因为bucket命名将会成为url的一部分。bucket创建完以后,可以用来存储文件,此处即用来存储图片。二、上传图片编码开始之前,我们需要先从github上安装aws sdk,可以通过下边代码在终端上执行来完成。$ go get github.com/aws/aws-sdk-go/...下边翻译 2020-10-29 10:51:54 · 2116 阅读 · 0 评论 -
gorm update时的坑
1.官方文档描述官方文档说的比较清楚,当update方法传入的是struct类型的数据时,如果字段数据是对应类型的0值,则对应字段不更新。比如如果我想把数据库里某个int字段值改为0,字符串类型改为"",传入struct类型,是改不成功的。// WARNING when update with struct, GORM will not update fields that with zero valuefunc (s *DB) Update(attrs ...interface{}) *DB {原创 2020-10-17 23:43:39 · 3643 阅读 · 0 评论 -
golang 如何识别不同语言
1.示例:golang识别希伯来文(hebrew)package mainimport ( "fmt" "regexp")func main() { english := "One, two three!" text2 := "Раз, два три!" text3 := "Jedna, dva tři čtyři pět!" hebrew := "חיים" // 希伯来文 fmt.Println(get_words_from(english)) fmt.Println(g原创 2020-10-17 23:29:43 · 2006 阅读 · 0 评论 -
go 类型判断 type-switch
示例:package mainimport "fmt"func main() { b := "1234" testTypeSwitch(b)}func testTypeSwitch(a interface{}) { // a需要是interface类型,a原有的类型有可能是复杂的结构体,或者是map // 不确定a的类型时,可以通过reflect.TypeOf(a) 来获取a原有的类型 // 此处示例仅是一些基础数据类型 switch a.(type) { c原创 2020-06-02 15:50:38 · 352 阅读 · 0 评论 -
go json、struct、map之间转换
1.json转structpackage mainimport ( "encoding/json" "fmt")// 结构体字段首字母必须要大写,否则外部无法访问,json转struct也转不成功type Person struct { Name string `json:"name"` Age int `json:"age"`}func main() { testJson2Struct()}func testJson2Struct() { jsonStr :=原创 2020-06-01 22:54:14 · 365 阅读 · 0 评论 -
go 概念辨析
1.go make和new的区别new(T) 返回 T 的指针 *T 并指向 T 的零值。make(T) 返回的初始化的 T,只能用于 slice,map,channel。参考:理解 Go make 和 new 的区别原创 2020-04-23 10:37:33 · 226 阅读 · 0 评论 -
go安装及环境配置
1.Linux下安装Go环境linux下go安装及环境配置原创 2020-01-17 10:39:46 · 313 阅读 · 0 评论 -
Go 常用工具资料搜集
1.RedisGo实战–golang中使用redis(redigo和go-redis/redis)2.flag包golang flag包使用笔记持续更新完善中原创 2019-11-29 11:30:09 · 305 阅读 · 0 评论 -
go语言记log-logger
介绍一下golang如何记log。log首先是golang自带的package log。使用godoc查看,godoc -http=:8001,然后就可以在localhost:8001/pkg/log就可以查看了。最重要的是SetOutput这个函数,原型是func SetOutput(w io.Writer),决定了log应该输出到什么地方,默认是标准输出。下面是把log输出到文件的一个简...转载 2019-10-31 19:15:46 · 643 阅读 · 0 评论 -
Go语言string,int,int64 ,float转换
1.int转strings := strconv.Itoa(i)等价于s := strconv.FormatInt(int64(i), 10)2.int64转stringi := int64(123)s := strconv.FormatInt(i, 10)第二个参数为基数,可选2~36注:对于无符号整形,可以使用FormatUint(i uint64, base int)3....转载 2019-08-08 08:14:43 · 713 阅读 · 0 评论