分类 编程.Golang 中的文章

Golang | redis

概述

网上有很多golang操作redis的例子,我使用github.com/gomodule/redigo/redis包写一个关于redis分布式锁的问题。

redis分布式锁

锁需要的几个组件

  • 获取锁
  • 删除锁

分布式锁还需要

  • 给锁加上唯一id (只能获取和删除自己的锁)
  • 给锁加上过期时间 (防止死锁)

golang代码

推荐使用redis的连接池

……

阅读全文

Golang | gomod拉取私有仓库

概述

在使用go mod的过程中,依赖的包往往是第三方库,当我们自定义一个包并且放在github.com私有仓库时候,按照原来的方法则会有如下问题。

get "gitlab.com/xxx/zz": found meta tag get.metaImport{Prefix:"gitlab.com/xxx/zz", VCS:"git", RepoRoot:"https://gitlab.com/xxx/zz.git"} at //gitlab.com/xxx/zz?go-get=1
  verifying gitlab.com/xxx/zz@v0.0.1: gitlab.com/xxx/zz@v0.0.1: reading https://sum.golang.org/lookup/gitlab.com/xxx/zz@v0.0.1: 410 Gone

这个错误是因为新版本go mod会对依赖包进行checksum校验,但是私有仓库对sum.golang.org是不可见的,它当然没有办法成功执行checksum

……

阅读全文

Golang | 定时器

概述

golang有三种方式实现定时器:

  • ticker
  • timer
  • select

Ticker

通过 time.NewTicker(d)的方式实现定时器

	d := time.Duration(time.Second * 2)
	t1 := time.NewTicker(d)
	defer t1.Stop()
	go func() {
		for  {
			<- t1.C
			fmt.Println("NewTicker...")
		}
	}()

Timer

通过 time.NewTimer(d)的方式实现定时器

……

阅读全文

Golang | JWT身份认证

概述

最近要在http接口上加一个token认证,但是接口很多,有没有一个省时省力的办法来解决。token的使用流程是:

  1. 用户使用帐号密码登陆到服务器1. 服务器验证登陆成功,根据帐号密码生成token。把token返回给客户端
  2. 客户端请求接口时需要带上token。服务器需要验证token。 接口是用golang的net/http库写的。为了实现目的,还需要添加的功能是:
  3. 生成和解析token的方法;
  4. 一个中间件,拦截请求,进行token认证,根据认证通是否过来决定是否继续执行请求; JWT身份认证可以解决第一个问题,mux.RouterUse方法函数可以作为一个中间件, 拦截请求。
func (r *Router) Use(mwf ...MiddlewareFunc) {
	for _, fn := range mwf {
		r.middlewares = append(r.middlewares, fn)
	}
}

JWT 身份认证

下载地址:

……

阅读全文

Protobuf | 请求参数为空的案例

参数为空的grpc请求怎么定义

google protobuf已经提供了空参数

//empty.proto

message Empty {<!-- -->}

使用方法,在proto文件中导入empty.proto, 定义一个请求参数和返回值为空的函数emptyfunction, 函数名字可以自定义。

//server.proto
import "google/protobuf/empty.proto";
service  pbservice{
    rpc emptyfunction(google.protobuf.Empty) return{google.protobuf.Empty}
}

以golang语言为例子,在go中对应的函数为:

……

阅读全文

Golang | C数组转化为Golang的切片类型

概述

最近在巩固cgo的基础知识,在网上看到一篇Go和C之间 字符串数组、切片类型转换的文章,让我想到我之前写的一篇在go中遍历C结构体数组的文章,让我有新的方法来解决之前的问题,把C的数组转化为Go的切片,对于文章的方法我直接”拿来主义“。

数组、字符串和切片

我们将一段特定长度的内存统称为数组。C语言的字符串是一个char类型的数组,字符串的长度需要根据表示结尾的NULL字符的位置确定。C语言中没有切片类型。
在Go语言中,数组是一种值类型,而且数组的长度是数组类型的一个部分。Go语言字符串对应一段长度确定的只读byte类型的内存。Go语言的切片则是一个简化版的动态数组。
Go语言和C语言的数组、字符串和切片之间的相互转换可以简化为Go语言的切片和C语言中指向一定长度内存的指针之间的转换。

……

阅读全文

Cgo | 遍历C结构体数组

缘由

现在有个应用场景,我们要在go中获取C结构体数组中的值。在C语言中,对于结构体数组,我们可以利用指针的偏移量来获取我们想要的值的位置。在go中我们怎么使用C指针和偏移量进行运算呢?下面的文字中C指的是C语言

……

阅读全文

Golang | sync.Mutex详解

概述

自己做的一个golang项目需要优化,优化方向是减少gpu内存的使用。同一个模型被重复加载多次,使用更多的gpu内存,也增加 sync.Mutex的使用。
优化的方向是:

  • 减少代码量的改动- 减少gpu内存的使用,同一个模型只用加载一次 涉及的问题:
  • sync.Mutex是传值还是传引用?- sync.Mutex可以拷贝么?- sync.Mutex需要申明为指针么?

sync.Mutex是传值还是传引用?

查看一个例子

……

阅读全文

Golang | 用gocolly登录B站

概述

gocolly是golang语言开发的爬虫包,通过gocolly来进行模拟网站的登录,
目标已经确立,开始行动。

下载

$ go get -u github.com/gocolly/colly

获取cookie

登录网站:https://www.bilibili.com/
获取cookie:

……

阅读全文

Protobuf | 沾包问题

缘由

最近在研究一款游戏的源码。发现里面的通信协议是protobuf定义的,但还是自己定义了协议头部,类似 head + body。先解析头部里所存储的整个包的数据长度,然后再解析包剩余的数据,这样做的目的是为了防止沾包。我在想都用了protobuf了为啥不直接用grpc呢。一时想不出,于是我用golnag + protobuf 做了一个简单的client + server

……

阅读全文