自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

潘广宇的博客

panguangyu.blog.csdn.net

  • 博客(300)
  • 资源 (1)
  • 收藏
  • 关注

原创 Golang 手把手搭建一个简单的 gRPC 服务

注意项:gRPC 和标准库的 RPC 框架有一个区别,gRPC 生成的接口并不支持异步调用。不过可以在多个 Goroutine 之间安全地共享 gRPC 底层的 HTTP/2 连接,因此可以通过在另一个 Goroutine 阻塞调用的方式模拟异步调用。2、安装 protoc-gen-go-grpc,安装方式参考上述文章提到的 protoc-gen-go 安装方式。

2024-04-10 16:55:32 421

原创 Golang ProtoBuf 初学者完整教程:语法

7、RPC 服务名和方法名,均使用首字母大写驼峰风格,例如service FooService{ rpc GetSomething() }4、消息名使用首字母大写驼峰风格(CamelCase),例如message StudentRequest { ... }1、文件名使用小写下划线的命名风格,例如 lower_snake_case.proto。5、字段名使用小写下划线的风格,例如 string status_code = 1。6、枚举类型,枚举名使用首字母大写驼峰风格,例如 enum FooBar。

2024-04-10 14:02:08 884

原创 Golang ProtoBuf 初学者完整教程:安装

Protobuf 在 .proto 定义需要处理的结构化数据,可以通过 protoc 工具,将 .proto 文件转换为 C、C++、Golang、Java、Python 等多种语言的代码。需要安装protoc-gen-go.exe可执行文件,当protoc命令执行时,当编译器调用时传递了 --go_out命令行标志时, protoc就会使用它。1、安装protoc:https://github.com/protocolbuffers/protobuf/releases。

2024-04-10 11:27:54 445

原创 Golang 实现一个简单的 RPC 服务

分享一个简单的 rpc 服务框架。

2024-04-09 20:58:56 535

原创 手把手教你搭建基于 Go kit 的 Http 微服务

实现一个简单的功能:通过http请求用户的uid,返回用户uid对应的name,age和level。Endpoint层主要负责Request/Response格式的转换,以及公用拦截器相关的逻辑。Transport层主要负责与传输协议HTTP,GRPC,THRIFT等相关的逻辑。Service层则专注于业务逻辑,就是我们的业务类、接口等相关信息存放。

2024-04-09 15:09:02 621

原创 Golang 为什么要使用接口

因为json、CSV都有一个步骤,就是读取,这样可以把这个步骤抽象出来(都属于一种Reader类型),这样就可以写出更方便和更通用的函数。上面这个例子中,重点关注的是 processFile 这个函数,它实现了不管什么类型(json、CSV)的文件,都可以处理。下面举一个例子,比如我想实现一个通用的函数,能够支持json、CSV文件的读取。这说明接口一个很重要的特点就是抽象,把不同类型的相同特点进行抽象统一。一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口。

2024-04-08 20:36:33 347

原创 Golang 为什么需要用反射

比如现在我想实现一个通用的db插入函数,支持我传入所有类型的struct,每一种类型的struct是一个单独的表,以struct的名称作为表名,然后插入到不同的表中。本质上是可以动态获取程序运行时的变量(类型)

2024-04-08 20:00:39 420

原创 Golang sync.Once 的作用

sync.Once的作用正是为了防止在多goroutine并发执行时,对某个操作进行重复的初始化。它确保即使在高度并发的场景下,某些高成本的初始化操作(比如创建资源、加载配置、设置全局状态等)也只会被执行一次。

2024-04-08 19:09:52 445

原创 Golang 基于共享变量的并发锁

原理:RWMutex允许多个goroutine同时获取读锁(RLock),进行并发读操作,而写锁(Lock)则是互斥的,同一时间只允许一个goroutine进行写操作。这意味着,一旦有goroutine开始写操作,其他想要读取或写入的goroutine都必须等待,直到写操作完成并且写锁被释放。RWMutex,即读写互斥锁,适用于读操作远远多于写操作的场景,当多个goroutine需要频繁地读取某个共享资源,而写入操作相对较少时,使用RWMutex可以提高并发性能。

2024-04-08 16:45:59 925

原创 理解 Golang 变量在内存分配中的规则

堆:大的局部变量,函数内部产生逃逸的变量,动态分配的数据,全局变量和静态变量。为什么有些变量在堆中分配、有些却在栈中分配?栈:函数局部变量,小数据。

2024-04-07 14:44:49 482

原创 Golang 创建一个简单的内存池

内存池主要作用是减少内存分配和释放的开销,提高程序的性能和效率。这样,当程序需要分配内存时,可以直接从内存池中获取一块已经分配好的内存,而不是每次都从操作系统申请新的内存。内存池可以设计为线程安全的,这样在多线程或多Goroutine的环境中,可以并发地从内存池中分配和释放内存,而不需要额外的同步操作。通过减少内存分配和释放的次数,内存池有助于降低垃圾回收器的工作负担,从而提高程序的运行效率。内存池可以减少内存碎片,因为内存池中的内存块是预先分配的,这样可以更有效地利用内存。

2024-04-07 14:00:54 419

原创 为什么要在 Golang 中使用指针

相反,你可以使用指针来传递文件内容的引用,这样可以避免复制整个文件内容,并允许多个 Goroutines 同时处理同一个文件。当你有一个大型的数据结构时,如果直接传递这个数据结构,会产生一个完整的副本,这会增加内存的使用和CPU的计算时间。使用指针,你可以只传递数据的地址,这样函数就可以直接在原始数据上操作,避免了复制的开销。如果你希望函数的修改反映到原始变量上,你需要传递变量的指针,这样函数就可以直接修改原始数据。如果你直接传递配置对象,那么函数内部修改的是对象的副本,并不会影响原始的全局配置。

2024-04-07 11:44:04 565

原创 GitLab 新项目创建和使用

如果提示已经生成后,可以忽略。然后用文件编辑器打开对应的目录的 id_rsa.pub 文件,将内容复制到 gitlab -> Setting -> SSH Keys 添加即可。下面的信息可以登录gitlab查看。

2024-04-03 15:37:04 597

原创 PhpSpreadsheet 读取 excel 里面的图片

使用 phpSpreadSheet 插件去读取 excel 里面的图片时发现坑点很多,这里做一个总结。这里会把excel里面的图片读取,然后存放到服务器指定的目录。解决方案:不要使用.xls格式的excel,使用.xlsx。在composer.json配置。我使用的是 tp 框架。composer安装。

2024-03-21 10:59:11 477 2

原创 Golang 方法的接收器 receiver 指针和值的区别

在 Go 语言中,如果一个方法的 receiver 是某个类型的指针,那么该类型的值和指针都可以调用这个方法。这是因为当 receiver 是指针类型时,Go 会自动进行指针解引用,以便让你方便地对这个类型的值进行操作。incr 方法的 receiver 是 Count 类型的指针。因此,既可以使用 Count 类型的值,也可以使用指向 Count 类型的指针来调用 incr 方法。

2024-03-07 10:55:16 381

原创 Golang 写日志到文件

os.O_EXCL: 与O_CREATE一起使用时,要求文件必须是新创建的,如果文件已经存在则返回错误。os.O_TRUNC: 如果可能,打开文件时先将文件内容清空。os.O_CREATE: 如果文件不存在则创建新文件。os.O_RDONLY: 以只读方式打开文件。os.O_WRONLY: 以只写方式打开文件。os.O_APPEND: 在文件末尾追加数据。os.O_SYNC: 打开文件用于同步I/O。os.O_RDWR: 以读写方式打开文件。

2024-03-07 09:38:34 574

原创 Golang 常用的时间转换

注意,这个时间2006-01-02 15:04:05完全不能改,是一个固定的时间(我不理解)Go 1.20之后增加的三个常量。

2024-03-06 15:38:14 453

原创 什么是 Golang 类型断言

在这里,areaIntf被赋值为sq1,而sq1是一个*Square类型的指针。因此,areaIntf包含了*Square类型的值,所以类型断言(areaIntf.(*Square))会返回一个非nil的*Square类型的指针,并且ok的值为true,表示类型断言成功。在Go语言中,类型断言返回两个值:转换后的值和一个布尔值,表示转换是否成功。类型断言:用于检查某个接口是否包含某个具体类型,语法x.(T),x是一个接口类型表达式,T是具体的类型,如果x包含的值可以被转换成T类型,则是ok。

2024-03-06 14:09:51 343

原创 Golang pprof 分析程序的使用内存和执行时间

也是可以通过 top 和 list 某个函数步骤去查看具体信息。-alloc_space:查看分配空间相关的信息。-inuse_space:查看当前内存使用情况。

2024-03-04 19:34:54 1177

原创 Golang 获取协程ID的方式

在协程执行函数里面,通过调用。

2024-03-04 15:12:34 167

原创 Golang Ants 构建协程池

2、当任务数大于协程数时,一个协程可以同时处理多个任务。3、监控是哪个协程ID处理了具体的任务。1、限制协程池里开启的协程数量。

2024-03-04 15:09:07 584

原创 Golang 函数中 defer 和 return 的调用顺序

2)关键字 defer 允许我们推迟到函数返回之前(或任意位置执行 return 语句之后)一刻才执行某个语句或函数。2)在函数最后返回前,执行defer()操作,对ret进行+1操作,这时候ret=10。2)在函数最后返回前,执行defer()操作,对ret进行+1操作,这时候ret=2。1) 函数先是执行到return 1,然后根据函数的声明,把1赋值给ret。1) 函数先是执行到return 9,然后根据函数的声明,把9赋值给ret。3)函数最终返回ret,所以2被main()所打印。

2024-02-29 20:39:52 320

原创 Golang 关于 interface 接口的理解

因为 Redis 类型实现了 StorageManager 接口中定义的所有方法(记住,是所有方法都必须实现定义)。在Go语言中,如果一个类型包含了接口中定义的所有方法,那么该类型就隐式地实现了该接口。在这里,Redis 类型实现了 insertData 和 updateData 方法,因此它可以被当做 StorageManager 类型使用。

2024-02-26 19:31:04 485

原创 Golang 语法系列:结构体

以上面的Person为例子,其实是通过一个函数来返回一个结构体指针实现的。5)格式5:通过&运算符直接对结构体进行取地址操作,然后完成实例化。4)格式4:通过new()函数实例化。// name age字段可以省略。2)格式2:通过键值对声明。3)格式3:匿名结构体。结构体:相当于"类"

2024-02-21 14:19:37 493

原创 Swoole 4.8版本的安装

然后通过 phpinfo() 获取到加载的swoole模块。

2023-10-24 16:33:18 374

原创 PHP 通过 Redis 解决并发请求的操作问题

SETNX(SET if Not eXists)是 Redis 中的一个原子命令,用于设置键-值对,但只有在键不存在时才执行设置操作。可以利用 SETNX 命令来实现并发请求的互斥处理,确保只有一个请求能够成功执行。需要注意的是,即使 SETNX 返回 1,表示当前请求获取到了锁并执行了业务逻辑,仍需要在合适的时机释放锁,以防止死锁情况的发生。如果 SETNX 返回 1,表示当前请求是第一个获取到锁的请求,可以执行相应的业务逻辑;如果 SETNX 返回 0,表示已经有其他请求获取到了锁,当前请求不处理。

2023-08-31 10:36:49 999

原创 Python 计算两篇文章的相似度

日常工作中,我们偶尔会遇到比如判断两篇文章是否雷同,可以通过计算两篇文章相似度去判断,下面是通过python实现的方式

2023-08-21 16:41:36 425

原创 Chatterbot 打造游戏AI客服机器人

这也是我自己探索出来的,之前没用分词工具的时候,发现拟合度很差,后面猜测是框架的计算对中文不准确,对中文的分词效果很差,导致计算出来的词向量其实是误差很大的。中文没有像英文一样的明显的单词边界,因此需要使用专门的中文分词工具将中文文本分成有意义的词语,这样计算出来的词向量才是比较精准的。简单来说,存储适配器提供了一个接口,允许ChatterBot连接到不同的存储技术,不指定默认使用 SQLite 数据库存储聊天记录,会在执行程序的目录生成一个db.sqlite3文件。如果存在,则返回包含结果的响应。

2023-06-20 10:02:51 2069

原创 Chatterbot 23.6.15 踩坑经历

执行报错:OSError: [E050] Can't find model 'en'. It doesn't seem to be a shortcut link, a Python package or a valid path to a data directory.在 segmentfault 上找到的大神的答案,要修改源文件 ...lib\site-packages\chatterbot\tagging.py。发现chatterbot使用的是旧的spacy模型,

2023-06-15 11:26:50 134

原创 Clickhouse 启动和使用

【代码】Clickhouse 启动和使用。

2023-05-10 16:41:29 518 1

原创 基于 PHP 的 Kafka 底层公共类的封装和调用

以TP5.0框架为例,在extend/创建RdKafkaClient.php。如何在 Thinkphp 5.0 下使用 kafka,5分钟上手!注:本文用到的是rdkafka公共类库,

2023-05-06 20:09:32 486

原创 Kafka 常用命令汇总

【代码】Kafka 常用命令汇总。

2023-05-06 19:44:30 551

原创 PHP Curl 使用 @ 上传文件失败的解决方法

遇到过一种情况,使用@+文件路径进行文件上传,然后Curl Post到另一个接口,发现测试环境是正常的,但正式环境却无法上传post不成功。如果不是上述php版本,则在curl配置。第一步,判断当前的 php 版本。

2023-04-18 19:31:19 363

原创 Linux TCP 连接数查询

查看每种情况下,TCP目前的连接数情况;统计3306端口上有多少个TCP连接

2023-01-04 17:47:26 1472

原创 PHP 删除数组里的指定元素

【代码】PHP 删除数组里的指定元素。

2022-12-30 14:17:45 173

原创 Json_decode 遇到非 UTF-8 等特殊字符解决方案

需要解析的字符串包含特殊符号,这时候直接通过 json_decode 返回 NULL。然后通过过滤得到字符串:甛?eЮ,然后再 json_decode 可以返回正常格式。我的解决方案,把特殊字符转成?

2022-09-05 15:44:29 796 1

原创 Javascript 判断一个变量是否是 JSON

Javascript 判断一个变量是否是 JSON

2022-06-06 19:46:08 431 1

原创 Git 版本管理工具最常用命令集合

GIT优势:分布式、多分支、速度快灵活、Git中的绝大多数操作都只需要访问本地文件和资源,不用连网,所以处理起来速度飞快一、创建项目git init # 将一个目录初始化为 Git 仓库git clone [url] # 复制一个git仓库二、基本快照git add [file] # 添加文件到缓存git status -s # 查看你的文件在工作目录与缓存的状态,返回的文件状态 ...

2022-05-09 17:35:05 430 4

原创 MySQL 出现数据库表被锁解决方案

一、出现的现象页面出现502错误,数据库CPU持续飙升,大量事务堆积未提交成功(事务一直处于阻塞阶段)查看阻塞事务列表,发现其中有锁表现象。二、排查与解决思路1)查看数据库中是否有表被锁show open tables where in_use > 0;如果上述返回有结果,说明有表正在被使用,返回字段如下| Database | Table | In_use | Name_locked |2)查看进程(只会显示当前用户的进程,除非是root用户)show pr.

2022-05-04 19:41:13 11451

原创 利用 PHP Trait 提高代码复用性

一、什么是 traitTrait 是从 PHP 5.4 加入的一种细粒度代码复用的语法。以下是官方手册对 Trait 的描述:Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 t

2022-05-01 16:42:42 161

OpenCV人脸识别项目完整代码

OpenCV人脸识别项目完整代码

2022-05-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除