自定义博客皮肤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

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

原创 Php 通过 FFmpeg 获取远程视频的时长和截图

突然发现 FFmpeg 这个软件还可以直接拉取远程视频的相关信息,也就是可以不通过下载视频到本地的方式,直接远程去获取视频时长和截图。经测试,以上过程的调用,并不需要完全把视频下载到本地再解析,可以实现远程获取直接秒级返回!假设我们的视频url是:http://my.com/a.mp4。第二步,通过composer安装FFmpeg的库。第一步,Linux 安装 FFmpeg 软件。

2024-04-23 17:52:46 57

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

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

2024-04-10 16:55:32 422

原创 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 890

原创 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 451

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

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

2024-04-09 20:58:56 536

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

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

2024-04-09 15:09:02 622

原创 Golang 为什么要使用接口

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

2024-04-08 20:36:33 348

原创 Golang 为什么需要用反射

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

2024-04-08 20:00:39 422

原创 Golang sync.Once 的作用

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

2024-04-08 19:09:52 447

原创 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 483

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

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

2024-04-07 14:00:54 422

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

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

2024-04-07 11:44:04 569

原创 GitLab 新项目创建和使用

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

2024-04-03 15:37:04 603

原创 PhpSpreadsheet 读取 excel 里面的图片

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

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

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

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

2024-03-07 10:55:16 384

原创 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 579

原创 Golang 常用的时间转换

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

2024-03-06 15:38:14 454

原创 什么是 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 1192

原创 Golang 获取协程ID的方式

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

2024-03-04 15:12:34 171

原创 Golang Ants 构建协程池

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

2024-03-04 15:09:07 587

原创 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 494

原创 Swoole 4.8版本的安装

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

2023-10-24 16:33:18 381

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

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

2023-08-31 10:36:49 1001

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

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

2023-08-21 16:41:36 434

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

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

2023-06-20 10:02:51 2073

原创 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 534 1

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

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

2023-05-06 20:09:32 494

原创 Kafka 常用命令汇总

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

2023-05-06 19:44:30 557

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

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

2023-04-18 19:31:19 367

原创 Linux TCP 连接数查询

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

2023-01-04 17:47:26 1478

原创 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 800 1

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

Javascript 判断一个变量是否是 JSON

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

原创 MySQL BTree 与 B+Tree 的原理和区别

系统从磁盘读取数据到内存时是以磁盘块 block 为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K一、BTree每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。每个磁盘块存储.

2022-05-12 19:51:35 1

原创 PHP 快速了解命名空间

命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字命名空间将代码划分出不同的空间(区域),每个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响一、基础1)命名空间的定义namespace Article; #当前脚本文件的第一个命名空间前面不能有任何代码2)同一脚本文件中可以创建多个命名空间//创建一个名为'Article'的命名空间namespace Article;//此Comment属于Article空间的元.

2022-05-10 20:06:45

OpenCV人脸识别项目完整代码

OpenCV人脸识别项目完整代码

2022-05-05

空空如也

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

TA关注的人

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